ASP.NET Core 6.0 中使用Autofac的項(xiàng)目實(shí)踐
1. 引用NuGet包
Install-Package Autofac -Version 6.3.0 Install-Package Autofac.Extensions.DependencyInjection -Version 7.2.0
2. Program 中注冊(cè)使用
2.1 普通注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(builder => {
builder.RegisterType<A>().As<IA>(); // 直接注冊(cè)某一個(gè)類和接口,左邊的是實(shí)現(xiàn)類,右邊的As是接口
});
2.2 反射程序集方式服務(wù)注冊(cè)
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
var assemblysServices = Assembly.Load("Exercise.Services");
containerBuilder.RegisterAssemblyTypes(assemblysServices)
.AsImplementedInterfaces()
.InstancePerLifetimeScope();
});
還可以進(jìn)行選擇性批量注入,注入之后通過 構(gòu)造函數(shù)或者屬性注入的方式使用。
3. AutoFac中常用方法說明
基本概念
1、AsImplementedInterfaces() 是以接口方式進(jìn)行注入,注入這些類的所有的公共接口作為服務(wù)
2、InstancePerRequest() 每次請(qǐng)求共享同一個(gè)實(shí)例,使用ef時(shí),使不同的操作使用同一個(gè)數(shù)據(jù)上下文
3、PreserveExistingDefaults() 如果不止一個(gè)組件暴露了相同的服務(wù), Autofac將使用最后注冊(cè)的組件作為服務(wù)的提供方,那么使用PreserveExistingDefaults防止后面注冊(cè)的覆蓋前面注冊(cè)的
builder.Register<A>() .As<IA>(); builder.Register<AA>() .As<IA>(); // 這樣AA就會(huì)覆蓋A builder.Register<AA>() .As<IA>().PreserveExistingDefaults(); // 這樣A是IA的默認(rèn)值,不會(huì)被AA覆蓋
4、InstancePerDependency為每個(gè)依賴或者調(diào)用(Resolve())都創(chuàng)建一個(gè)新的對(duì)象,唯一的實(shí)例
5、SingleInstance 為每次請(qǐng)求都使用同一個(gè)對(duì)象,單例模式.告訴容器,是個(gè)單例,但這個(gè)單例不用自己實(shí)現(xiàn)。
6、RegisterGeneric 對(duì)泛型類進(jìn)行注冊(cè)
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>))
7、RegisterInstance() 注冊(cè)一個(gè)實(shí)例,比如: 對(duì)已經(jīng)存在的對(duì)象的實(shí)例進(jìn)行注冊(cè),這樣可以使實(shí)例轉(zhuǎn)化為由容器托管的實(shí)例
8、RegisterControllers() 注冊(cè)Controllers
builder.RegisterControllers(Assembly.GetExecutingAssembly()); // 注冊(cè)當(dāng)前程序集中的所有Controllers
9、RegisterFilterProvider() 注冊(cè)Filter過濾器
builder.RegisterFilterProvider()
10、RegisterAssemblyTypes 注冊(cè)類
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()); // 注冊(cè)了當(dāng)前程序集內(nèi)的所有的類
11、InstancePerMatchingLifetimeScope 在一個(gè)做標(biāo)識(shí)的生命周期域中,每一個(gè)依賴或調(diào)用創(chuàng)建一個(gè)單一的共享的實(shí)例。打了標(biāo)識(shí)了的生命周期域中的子標(biāo)識(shí)域中可以共享父級(jí)域中的實(shí)例
builder.RegisterType<A>() .AsImplementedInterfaces() .InstancePerMatchingLifetimeScope();
12、InstancePerHttpRequest在一次Http請(qǐng)求上下文中,共享一個(gè)組件實(shí)例。僅適用于asp.net mvc開發(fā)
13、InstancePerLifetimeScope在一個(gè)生命周期中,每一次的依賴組件或調(diào)用(Resolve())創(chuàng)建一個(gè)單一的共享的實(shí)例,且每一個(gè)不同的生命周期域,實(shí)例是不同的
14、UsingConstructor(參數(shù)) 自動(dòng)裝配,手動(dòng)使用特定的構(gòu)造函數(shù)
builder.RegisterType<A>().UsingConstructor(typeof(IA),typeof(IAA)); // 這樣指定調(diào)用的是A(IA,IAA)的構(gòu)造函數(shù),如果該構(gòu)造函數(shù)不存在則報(bào)錯(cuò)
15、[AsClosedTypesOf(open)]AsClosedTypesOf(typeof(IA<>)): 如果是多繼承的話,注冊(cè)的程序集所對(duì)應(yīng)的服務(wù)(接口)是離這個(gè)類最近的開放的泛型實(shí)例(接口)
builder.RegisterAssemblyTypes(A).AsClosedTypesOf(typeof(IRepository<>));
Autofac中涉及的生命周期
//1、瞬時(shí)生命周期:注冊(cè)之后,每次獲取到的服務(wù)實(shí)例都不一樣(默認(rèn)的注冊(cè)方式)
containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerDependency();
//2、單例生命周期:整個(gè)容器中獲取的服務(wù)實(shí)例都是同一個(gè)
containerBuilder.RegisterType<UserService>().As<IUserService>().SingleInstance();
//3、作用域生命周期:在相同作用域下獲取到的服務(wù)實(shí)例是相同的
containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();
//4、作用域生命周期:可以指定到某一個(gè)作用域,然后在相同作用域下共享服務(wù)實(shí)例
containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerMatchingLifetimeScope("My");
//5、http請(qǐng)求上下文的生命周期:在一次Http請(qǐng)求上下文中,共享一個(gè)組件實(shí)例。僅適用于asp.net mvc開發(fā)。
containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerRequest();
//6、擁有隱式關(guān)系類型的創(chuàng)建新的嵌套生命周期的作用域,在一個(gè)生命周期域中所擁有的實(shí)例創(chuàng)建的生命周期中,
// 每一個(gè)依賴組件或調(diào)用Resolve()方法創(chuàng)建一個(gè)單一的共享的實(shí)例,并且子生命周期域共享父生命周期域中的實(shí)例
containerBuilder.RegisterType<UserService>().InstancePerOwned<IUserService>(); 到此這篇關(guān)于ASP.NET Core 6.0 中使用Autofac的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)ASP.NET Core使用 Autofac內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET Core中快速構(gòu)建PDF文檔的步驟分享
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中快速構(gòu)建PDF文檔的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Asp.net MVC中使用JQuery插件ajaxFileUpload上傳文件
這篇文章主要介紹了Asp.net MVC中使用JQuery插件ajaxFileUpload上傳文件,需要的朋友可以參考下2016-08-08
jenkins部署.net平臺(tái)自動(dòng)化構(gòu)建的方法步驟
這篇文章主要介紹了jenkins部署.net平臺(tái)自動(dòng)化構(gòu)建的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
ASP.NET Core 2.0 WebApi全局配置及日志實(shí)例
下面小編就為大家分享一篇ASP.NET Core 2.0 WebApi全局配置及日志實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12
ASP.NET Core中修改配置文件后自動(dòng)加載新配置的方法詳解
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中修改配置文件后自動(dòng)加載新配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
ASP.NET搭配Ajax實(shí)現(xiàn)搜索提示功能
為了更好的用戶體驗(yàn),不論是桌面軟件還是網(wǎng)站,在搜索查詢的輸入中都會(huì)加入提示功能,就像百度搜索一樣!今天筆者就ASP.NET編程介紹一下如何利用Ajax來實(shí)現(xiàn)搜索信息提示功能。2015-09-09
.NET微信小程序用戶數(shù)據(jù)的簽名驗(yàn)證和解密代碼
這篇文章主要介紹了.NET微信小程序用戶數(shù)據(jù)的簽名驗(yàn)證和解密代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
一天精通asp.net的學(xué)習(xí)經(jīng)驗(yàn)小結(jié)
一天精通asp.net的學(xué)習(xí)經(jīng)驗(yàn)小結(jié)2010-02-02
asp.net動(dòng)態(tài)獲取Excel表名的函數(shù)代碼
asp.net動(dòng)態(tài)獲取Excel表名的函數(shù)代碼,需要的朋友可以參考下。2011-02-02

