内置依赖注入
ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,这是一种在类及其依赖关系之间实现控制反转 (IoC) 的技术。
一 组件包
实现ASP.NET Core内置依赖注入,需要使用它的抽象与实现两个组件包。
- Microsoft.Extensions.DependencyInjection.Abstractions
- Microsoft.Extensions.DependencyInjection
二 核心类
1.ASP.NET Core内置依赖注入,包含了4个核心类,实现了容器内服务的注册和生命周期管理。
- IServiceCollection 负责服务的注册。
- ServiceDescriptor 服务注册时的信息
- IServiceProvider 服务容器
- IServiceScope 子容器的生命周期
2.生命周期ServiceLifetime
- Singleton 单例
- Transient 瞬时
- Scoped 作用域
三 注册方式
public void ConfigureServices(IServiceCollection services) { //单例注册 services.AddSingleton<ISingletonService, SingletonService>(); //瞬时注册 services.AddTransient<ITransientService, TransientService>(); //作用域注册 services.AddScoped<IScopedService, ScopedService>(); services.AddMvc(); }
用Autofac增强容器能力
Autofac是比较老牌的第三方IOC容器。
一 组件包
替换内置的DI容器管理需要引用Autofac的实现组件包,使用AOP需要引入Autofac动态代理组件包
- Autofac.Extensions.DependencyInjection
- Autofac.Extras.DynamicProxy
二 核心扩展接口
public interface IServiceProviderFactory<TContainerBuilder>
三 注册方式
Program修改部分高亮显示。
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
Startup类代码修改内容高亮显示。
public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void ConfigureContainer(ContainerBuilder builder) { //注册单例 builder.RegisterType<SingletonService>().As<ISingletonService>().SingleInstance(); //注册顺时 builder.RegisterType<TransientService>().As<ITransientService>(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } }
四 使用方法
下面使用了构造函数注入和方法注入
public class HomeController : Controller { private readonly ISingletonService _singletonService; private readonly ITransientService _transientService; public HomeController(ISingletonService singletonService, ITransientService transientService) { _singletonService = singletonService; _transientService = transientService; } [HttpGet] public string Get([FromServices]ISingletonService singletonService1, [FromServices]ISingletonService singletonService2 , [FromServices]ITransientService transientService1, [FromServices]ITransientService transientService2) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append($"singletonService:{_singletonService.GetHashCode()}<br />"); stringBuilder.Append($"singletonService1:{singletonService1.GetHashCode()}<br />"); stringBuilder.Append($"singletonService2:{singletonService2.GetHashCode()}<br />"); stringBuilder.Append($"_transientService:{_transientService.GetHashCode()}<br />"); stringBuilder.Append($"transientService1:{transientService1.GetHashCode()}<br />"); stringBuilder.Append($"transientService2:{transientService2.GetHashCode()}"); return stringBuilder.ToString(); } }