ASP.NET Core 6.0 中使用Autofac的項目實踐
1. 引用NuGet包
Install-Package Autofac -Version 6.3.0 Install-Package Autofac.Extensions.DependencyInjection -Version 7.2.0
2. Program 中注冊使用
2.1 普通注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); builder.Host.ConfigureContainer<ContainerBuilder>(builder => { builder.RegisterType<A>().As<IA>(); // 直接注冊某一個類和接口,左邊的是實現(xiàn)類,右邊的As是接口 });
2.2 反射程序集方式服務(wù)注冊
builder.Host.ConfigureContainer<ContainerBuilder>(builder => { var assemblysServices = Assembly.Load("Exercise.Services"); containerBuilder.RegisterAssemblyTypes(assemblysServices) .AsImplementedInterfaces() .InstancePerLifetimeScope(); });
還可以進行選擇性批量注入,注入之后通過 構(gòu)造函數(shù)或者屬性注入的方式使用。
3. AutoFac中常用方法說明
基本概念
1、AsImplementedInterfaces() 是以接口方式進行注入,注入這些類的所有的公共接口作為服務(wù)
2、InstancePerRequest() 每次請求共享同一個實例,使用ef時,使不同的操作使用同一個數(shù)據(jù)上下文
3、PreserveExistingDefaults() 如果不止一個組件暴露了相同的服務(wù), Autofac將使用最后注冊的組件作為服務(wù)的提供方,那么使用PreserveExistingDefaults防止后面注冊的覆蓋前面注冊的
builder.Register<A>() .As<IA>(); builder.Register<AA>() .As<IA>(); // 這樣AA就會覆蓋A builder.Register<AA>() .As<IA>().PreserveExistingDefaults(); // 這樣A是IA的默認值,不會被AA覆蓋
4、InstancePerDependency為每個依賴或者調(diào)用(Resolve())都創(chuàng)建一個新的對象,唯一的實例
5、SingleInstance 為每次請求都使用同一個對象,單例模式.告訴容器,是個單例,但這個單例不用自己實現(xiàn)。
6、RegisterGeneric 對泛型類進行注冊
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>))
7、RegisterInstance() 注冊一個實例,比如: 對已經(jīng)存在的對象的實例進行注冊,這樣可以使實例轉(zhuǎn)化為由容器托管的實例
8、RegisterControllers() 注冊Controllers
builder.RegisterControllers(Assembly.GetExecutingAssembly()); // 注冊當(dāng)前程序集中的所有Controllers
9、RegisterFilterProvider() 注冊Filter過濾器
builder.RegisterFilterProvider()
10、RegisterAssemblyTypes 注冊類
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()); // 注冊了當(dāng)前程序集內(nèi)的所有的類
11、InstancePerMatchingLifetimeScope 在一個做標(biāo)識的生命周期域中,每一個依賴或調(diào)用創(chuàng)建一個單一的共享的實例。打了標(biāo)識了的生命周期域中的子標(biāo)識域中可以共享父級域中的實例
builder.RegisterType<A>() .AsImplementedInterfaces() .InstancePerMatchingLifetimeScope();
12、InstancePerHttpRequest在一次Http請求上下文中,共享一個組件實例。僅適用于asp.net mvc開發(fā)
13、InstancePerLifetimeScope在一個生命周期中,每一次的依賴組件或調(diào)用(Resolve())創(chuàng)建一個單一的共享的實例,且每一個不同的生命周期域,實例是不同的
14、UsingConstructor(參數(shù)) 自動裝配,手動使用特定的構(gòu)造函數(shù)
builder.RegisterType<A>().UsingConstructor(typeof(IA),typeof(IAA)); // 這樣指定調(diào)用的是A(IA,IAA)的構(gòu)造函數(shù),如果該構(gòu)造函數(shù)不存在則報錯
15、[AsClosedTypesOf(open)]AsClosedTypesOf(typeof(IA<>)): 如果是多繼承的話,注冊的程序集所對應(yīng)的服務(wù)(接口)是離這個類最近的開放的泛型實例(接口)
builder.RegisterAssemblyTypes(A).AsClosedTypesOf(typeof(IRepository<>));
Autofac中涉及的生命周期
//1、瞬時生命周期:注冊之后,每次獲取到的服務(wù)實例都不一樣(默認的注冊方式) containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerDependency(); //2、單例生命周期:整個容器中獲取的服務(wù)實例都是同一個 containerBuilder.RegisterType<UserService>().As<IUserService>().SingleInstance(); //3、作用域生命周期:在相同作用域下獲取到的服務(wù)實例是相同的 containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope(); //4、作用域生命周期:可以指定到某一個作用域,然后在相同作用域下共享服務(wù)實例 containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerMatchingLifetimeScope("My"); //5、http請求上下文的生命周期:在一次Http請求上下文中,共享一個組件實例。僅適用于asp.net mvc開發(fā)。 containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerRequest(); //6、擁有隱式關(guān)系類型的創(chuàng)建新的嵌套生命周期的作用域,在一個生命周期域中所擁有的實例創(chuàng)建的生命周期中, // 每一個依賴組件或調(diào)用Resolve()方法創(chuàng)建一個單一的共享的實例,并且子生命周期域共享父生命周期域中的實例 containerBuilder.RegisterType<UserService>().InstancePerOwned<IUserService>();
到此這篇關(guān)于ASP.NET Core 6.0 中使用Autofac的項目實踐的文章就介紹到這了,更多相關(guān)ASP.NET Core使用 Autofac內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net core為IHttpClientFactory添加動態(tài)命名配置
某些時候我們需要為HttpClient動態(tài)配置一些東西, 例如證書等, 例如服務(wù)是一個回調(diào)服務(wù), 而被回調(diào)方采用了自定義的https(即自定義證書),本文就將講述如何實現(xiàn)這種需求2021-06-06ASP.NET MVC5網(wǎng)站開發(fā)管理列表、回復(fù)及刪除(十三)
這篇文章主要介紹了ASP.NET MVC5網(wǎng)站開發(fā)實現(xiàn)管理列表、回復(fù)及刪除,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-09-09ASP.Net MVC_DotNetZip簡單使用方法,解決文件壓縮的問題
下面小編就為大家?guī)硪黄狝SP.Net MVC_DotNetZip簡單使用方法,解決文件壓縮的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06ASP.Net PlaceHolder、Panel等控件未實現(xiàn)INamingContainer,導(dǎo)致FindContro
這2天在開發(fā)中發(fā)現(xiàn),如果在new的Panel中使用FindControl,會出現(xiàn)找不到控件的情況2009-06-06