.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)。
作者:屈魯奇
出處:https://www.cnblogs.com/quluqi
聯系:[email protected] QQ:496195435
本文版權歸作者和部落格園共有,歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。如有問題或建議,請多多賜教,非常感謝。