Autofac
..Net CoreAutofacIocDI什么是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 的常用容器
- .Net Core 自带容器
- Autofac
.Net 自带容器的使用说明
.Net Core 自带容器的注入一般在Startup中的 public void ConfigureServices(IServiceCollection services) 方法中进行. 根据生命周期区分为三种.
- AddTransient<服务,组件>(); //瞬时的,每次使用都会为服务注入一个新的实例.
- AddScoped<服务,组件>(); //一次http请求之后使用一个实例,即任何地方调用都是同一个对象.
- AddSingle<服务,组件>(); //单例的,在第一次http请求之后会生成一个实例,并且此实例会一直被使用到 .net core 程序生命周期结束,即全局单例.