Autofac

Posted hellozyjs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Autofac相关的知识,希望对你有一定的参考价值。

Autofac

什么是IOC

控制反转(inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency Injection,简称DI)

IOC: 调用者不再创建(不自己new) 被调用者的实例,而是交给容器去创建,这就是控制反转.
DI:容器创建好的实例再注入调用者的过程,就是依赖注入. (比如属性入住构造函数注入等.)

为什么要使用IOC

我们日常使用的设计模式多为接口驱动设计,接口驱动设计有很多好处,可以提供不同灵活的子类实现的,增加代码稳定和健壮性等等.

但是接口一定需要实现的,也就是如下语句迟早要执行:
AInterface 啊= new AInterfaceImp();
所以,按照一般的方法使用接口,即会出现耦合.

构建一个简单的依赖注入的例子

创建服务(接口)

public interface ITestServices
{
        int Count { get; }
        void Add();
}

创建组件(实现类)

public class TestServicesImpl : ITestServices
{
        private int _count;

        public TestServicesImpl()
        {
            _count = 0;
        }

        public int Count => this._count;

        public void Add()
        {
            _count++;
        }
}

创建控制器

[Route("api/TestServices")]
[ApiController]
    public class TestServicesController:ControllerBase
    {
        private readonly ITestServices _testServices;

       // 通过构造函数的形式获取ITestServices服务的注册实例
        public TestServicesController(ITestServices testServices)
        {
            _testServices = testServices;
        }

        [HttpGet]
        public Tuple<int, int> Get()
        {
            var before = this._testServices.Count;   //拿到老的统计值
            this._testServices.Add();                       //自增一个统计值
            var after = this._testServices.Count;      //获取新的统计值
            return new Tuple<int, int>(before,after);//返回老的统计值和新的统计值
        }
    }

在 .Net Core 自带的注入服务的方法中,使用 .Net Core 自带的注入服务进行组件注入


// 在 StartUp类中的  ConfigureServices 方法中进行注入
 public void ConfigureServices(IServiceCollection services)
{
            services.AddControllers();

            //将组件TestServicesImpl,注册给ITestServices 服务
            services.AddScoped<ITestServices, TestServicesImpl>();  
}

IoC 是如何降低耦合的

Class A中用到了Class B 的对象b,一般情况下,需要在A的代码中显式的new一个B的对象.

采用依赖注入技术之后,A的代码值需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类的引用中.二集体获取的方法,对象被获取时的状态由配置(如XML)来指定.

容器

Ioc 模式,系统中通过引入实现了Ioc模式的Ioc容器,即可由Ioc容器来管理对象的生命周期,依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分离.其中一个特点就是通过配置进行应用程序组件间相互关系的配置,而不用重新修改并编写具体的代码.

.Net Core 的常用容器
  1. .Net Core 自带容器
  2. Autofac
.Net 自带容器的使用说明

.Net Core 自带容器的注入一般在Startup中的 public void ConfigureServices(IServiceCollection services) 方法中进行. 根据生命周期区分为三种.

  1. AddTransient<服务,组件>(); //瞬时的,每次使用都会为服务注入一个新的实例.
  2. AddScoped<服务,组件>(); //一次http请求之后使用一个实例,即任何地方调用都是同一个对象.
  3. AddSingle<服务,组件>(); //单例的,在第一次http请求之后会生成一个实例,并且此实例会一直被使用到 .net core 程序生命周期结束,即全局单例.

在 .Net Core 中如果要在Action中,拿到来自注入的实例对象,我们需要使用如下语句,我们可以注意到,在形参中,加入了[FromServices]的标注.

[HttpGet]
public Tuple<int, int> Get([FromServices] ITestServices testServices)
{
            var before = this._testServices.Count;
            this._testServices.Add();
            var after = this._testServices.Count;

            return new Tuple<int, int>(before,after);
}

以上是关于Autofac的主要内容,如果未能解决你的问题,请参考以下文章

autofac v4.0+通过配置文件的方式注册组件

Autofac使用代码方式进行组件注册不需要依赖

浅析依赖注入框架Autofac的使用

用 autofac 注册抽象类

Autofac

Autofac 依赖注入框架