Autofac的使用
「Autofac簡介」 「基本的使用方式」 「如何實作webapi控制器自動注入介面」
一、Autofac簡介
?Autofac是實作依賴注入的類別庫之一,他可以幫助你實作程式的解耦,所謂 「“上層模塊不應依賴于底層模塊,應當依賴于抽象,而不應依賴于細節”」,哈哈,咱們說點白話吧,意思就是說 「頂層的模塊不應直接依賴于底層模塊以及具體的實作,應當有個抽象層在中間,只知道有什么方法就行, 具體怎么實作,細節不管」,這樣的好處在于解耦,頂層模塊通過介面得到對應實作,不在乎到底是哪個具體物件,只要有這個方法就可以(介面嘛),可以任意更換介面對應實作,而不需要修改代碼,
?
二、基本使用
使用方式如下
?首先打開NuGet獲取Autofac.Integration.WebApi,獲取了之后,參考中會多出如下兩個dll庫
?
「Autofac.dll」(這個非常重要,主要使用它) 「Autofac.Integration.WebApi.dll」(這個在實作WebApi自動注入時需要)
?專案中引入了Autofac的dll庫后,我們就可以開始正式使用Autofac了
?
基礎使用
//創建IOC容器構建物件
var builder = new ContainerBuilder();
//注冊介面與具體實作的對應
builder.RegisterType<SqlDatabase>().As<IDataBase>();
//創建容器——此時的容器中已有如上注冊的映射關系
var container = builder.Build();
//通過容器注入介面,得到之前注冊的具體實作
var db = container.Resolve<IDataBase>();
一個介面對應多個實作的使用
//創建IOC容器構建物件
var builder = new ContainerBuilder();
//注冊同一介面對應多個實作,通過Named方法解決,加入關鍵字
builder.RegisterType<SqlDatabase>().Named<IDataBase>("sql");
builder.RegisterType<OracleDatabase>().Named<IDataBase>("oracle");
//創建容器——此時的容器中已有如上注冊的映射關系
var container = builder.Build();
//通過容器注入介面+關鍵字,得到之前注冊的具體實作
var dbSQL = container.ResolveNamed<IDataBase>("sql");
var dbOracle = container.ResolveNamed<IDataBase>("oracle");
WebApi中,使用Autofac自動注入控制器
?跟Unity有所不同,Unity只要創建了正確的容器,在
?Application_Start中配置一下即可,「Unity」設定方式如下所示:
//實體化容器,并注冊介面對應的資源類
var container = new UnityContainer();
container.RegisterType<IProductRepository, ProductRepository>();
//設定依賴
config.DependencyResolver = new UnityDependencyResolver(container)
到此,發起Webapi請求時,webapi控制器中的介面就會被注入
Autofac的webapi介面自動注入
廢話不多說,很簡單,如下所示:
//創建容器構建物件
var builder = new ContainerBuilder();
//注冊介面與實作的對應
builder.RegisterType<SqlDatabase>().Named<IDataBase>("sql");
builder.RegisterType<OracleDatabase>().Named<IDataBase>("oracle");
//這點非常重要:將所有程式集加載進來
Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
//然后呼叫方法,將程式集中的所有webapi控制器注冊到構建物件
builder.RegisterApiControllers(assemblies).PropertiesAutowired();
//創建容器——此時的容器中已有如上的注冊映射關系,以及所有程式集中的webapi控制器的注冊
var container = builder.Build();
//設定給依賴關系決議程式
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
此時,WebApi控制器已經可以自動注入介面 「Autofac不需要給屬性設定Dependency特性,就可自動實作注入」
本文使用 mdnice 排版
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/106104.html
標籤:.NET技术
