Skip to content

ASP.NET Core 依赖注入

L edited this page Feb 24, 2020 · 4 revisions

.net core 自带的依赖注入

实际上依赖注入可用于 .NET Core 的 Console app/asp .net core...

概念

在.Net Core里提供了默认的依赖注入容器IServiceCollection,它是一个轻量级容器。核心组件为两个IServiceCollectionIServiceProvider,IServiceCollection负责注册,IServiceProvider负责提供实例
使用两个核心组件前导入命名空间Microsoft.Extensions.DependencyInjection
默认的ServiceCollection有以下三个方法:

IServiceCollection serviceCollection=new ServiceCollection();
#三个方法都是注册实例只不过实例的生命周期不一样。
#单例模式,只有一个实例
serviceCollection.AddSingleton<ILoginService, EFLoginService>();
#每次请求都是同一个实例比如EntityFramework.Context
serviceCollection.AddScoped<ILoginService, EFLoginService>();
#每次调用都是不同的实例
serviceCollection.AddTransient<ILoginService, EFLoginService>();

三个方法对应的生命周期值,在枚举ServiceLifeTime中定义:

public enum ServiceLifetime
{
   Singleton,
   Scoped,
   Transient,
}

ASP.NET Core里依赖注入是怎样运行的

1.在Startup中注入 ASP.NET Core在Startup.ConfigureService中注入指定服务,可以从方法参数IServiceCollection中看出,这里还有个方法services.AddMvc(), 这个MVC框架本身自己注入的服务,定义在MvcServiceCollectionExtesnsions类中。

#Startup
public void ConfigureServices(IServiceCollection services)
{
     services.AddMvc();
     services.AddSingleton<ILoginService, EFLoginService>();
}

2.在构造函数中注入(使用) 官方推荐在构造器中注入,这里也是为了体现显示依赖。

public class AccountController
{
    private ILoginService _loginService;
    public AccountController(ILoginService loginService)
    {
        _loginService = loginService;
    }
}

在.net core控制台中使用依赖注入

var serviceProvider = new ServiceCollection()
			//单例模式,只有一个实例
			.AddSingleton<ILogService, ConsoleLogService>()
			//每次请求都是同一个实例,比如EntityFramework.Context
			//.AddScoped<ILogService, ConsoleLogService>()
			//每次调用都是不同的实例
			//.AddTransient<ILogService, ConsoleLogService>()
			.BuildServiceProvider();
var _logService = serviceProvider.GetService<ILogService>();
_logService.Log(context);

如何替换其他容器

根据第三方的说明文档修改,不同的.net core版本方式不同

示例代码

asp .net core依赖注入-Services
asp .net core依赖注入-Startup
asp .net core依赖注入-LogController
.net core console依赖注入

参考资料

在 ASP.NET Core 依赖注入

Castle Windsor

依赖注入可以有很多种实现,Castle Windsor是依赖注入的其中一种实现

参考资料

Windsor
windsor官网
Abp 源码分析:三、依赖注入
深入理解ASP.NET Core依赖注入

示例代码

WindsorContainerTestController

Clone this wiki locally