-
Notifications
You must be signed in to change notification settings - Fork 22
ASP.NET Core 依赖注入
L edited this page Feb 24, 2020
·
4 revisions
实际上依赖注入可用于 .NET Core 的 Console app/asp .net core...
在.Net Core里提供了默认的依赖注入容器IServiceCollection,它是一个轻量级容器。核心组件为两个IServiceCollection
和IServiceProvider
,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,
}
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;
}
}
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依赖注入
依赖注入可以有很多种实现,Castle Windsor是依赖注入的其中一种实现