依赖注入
一个类需要调用另外一个类就是依赖,比如A类中需要调用B类才能完成功能,就是A类依赖B类。
通常完成一个功能(或者叫业务)会有很多很多的依赖关系(比如A类依赖B类)。当一个业务完成后,过一段时间因为需求修改了B类的代码,那因为这个业务代码有依赖关系,整个业务代码就都需要修改。
面向接口编程,依赖于抽象,就可以解决这些太过耦合的依赖关系,也叫代码耦合。
比如,写一个接口C,B类实现接口C,A类依赖接口C。以后还可以根据需要让D类、E类实现接口C。这时,A类需要调用B类时,就不用去new一个B类的实例了,而是通过构造函数或其他方式让外界把这两个依赖的实例传给你,把依赖的创建丢给其它人,自己只负责使用,其它人丢给你依赖的这个过程理解为注入。
依赖的注入一般就是使用框架来配置了。比如,以后不需要B类的实例,需要E类的实例,因为E类实现了接口C,所以直接通过一些框架配置依赖注入把E类注入就可以了,不需要修改其他业务代码了。
ASP.NET Core 依赖注入
在.NET Core中依赖注入主要组件为IServiceCollection和 IServiceProvider。我理解的IServiceCollection和 IServiceProvider这两个是服务和容器。官方把需要注入的实例或实现称为服务(service)。
NET Core DI (Denpendency Injection)为我们提供的实例生命周期包括三种:
Transient: 每一次GetService都会创建一个新的实例
Scoped: 在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)
Singleton :整个应用程序生命周期以内只创建一个实例
依赖注入在ASP.NET Core中的使用
1、在Startup类中配置
ASP.NET Core可以在Startup.cs的 ConfigureService中配置DI, 组件为IServiceCollection。
使用这个组件进行配置添加需要注入的服务。
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IMyService, MyService>();
services.AddMvc();//组件已经提供了一些实例的绑定,AddMvc就是Mvc Middleware在 IServiceCollection上添加的扩展方法。
)
AddTransient<IMyService,MyService>中的第一个参数表示要从容器中请求的类型(一般是一个接口),第二个参数表示将由容器实例化并用于满足此类请求的具体类型。 简单的说,第一个参数是接口,第二个参数是接口的实现。
2、在Controller中使用
可以通过构造函数或者属性来实现注入,官方推荐通过构造函数。这也是所谓的显式依赖。
private IMyService<User> _myservice;
public HomeController(IMyService service)
{
_myservice = service;
}