.netcore內置依賴注入,通過services.AddTransient、services.AddScoped、services.AddSingleton這些方法即可實現構造函數注入。
Autofac可完美替換系統的依賴注入功能,可實現構造函數注入和屬性注入,替換過程:
1、添加引用:
2、Program修改:
1 public static IHostBuilder CreateHostBuilder(string[] args) => 2 Host.CreateDefaultBuilder(args) 3 .UseServiceProviderFactory(new AutofacServiceProviderFactory())//集成Autofac 4 .ConfigureWebHostDefaults(webBuilder => 5 { 6 webBuilder.UseStartup<Startup>(); 7 });
這里就加了一行
3、Startup修改:
1 //集成Autofac 2 public void ConfigureContainer(ContainerBuilder builder) 3 { 4 //添加依賴注入實例,AutofacModuleRegister就繼承自Autofac.Module的類 5 builder.RegisterModule(new StartupHelp.AutofacModuleRegister()); 6 }
這是新加的方法,由Autofac來調用,里面就是注冊依賴的地方,此處使用了外置對象來注入
4、注入實現AutofacModuleRegister如下:
1 public class AutofacModuleRegister : Autofac.Module 2 { 3 protected override void Load(ContainerBuilder builder) 4 { 5 //程序集范圍注入 6 builder.RegisterAssemblyTypes(typeof(ManagerService).Assembly) 7 .Where(t => t.Name.EndsWith("Service")) 8 .AsImplementedInterfaces().PropertiesAutowired(); 9 //單個注冊 10 builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().PropertiesAutowired(); 11 12 //在控制器中使用屬性依賴注入,其中注入屬性必須標注為public 13 var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes() 14 .Where(type => typeof(Microsoft.AspNetCore.Mvc.ControllerBase).IsAssignableFrom(type)).ToArray(); 15 builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired(); 16 } 17 }
其中注冊類必須繼承自Autofac.Module,並且在Load中實現注入,此處應用了程序集范圍的注入以及單個對象的注入,最后添加的代碼是為了支持控制器的屬性注入。
注入的接口(如IUnitOfWork)和實現(UnitOfWork)沒有特別。
注入對象的生命周期與.netcore內置的一致。
5、使用,可以通過構造函數注入和屬性注入,如下:
1 public IManagerService _managerService { get; set; } 2 private readonly ILogger _logger; 3 4 public AccountController(ILogger<AccountController> logger) 5 { 6 _logger = logger; 7 }
其中_logger使用構造函數注入,_managerService為屬性注入(應聲明為public)。