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>();  // 直接注冊某一個類和接口,左邊的是實現類,右邊的As是接口
});

2.2 反射程序集方式服務注冊

builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
   var assemblysServices = Assembly.Load("Exercise.Services");
   containerBuilder.RegisterAssemblyTypes(assemblysServices)
              .AsImplementedInterfaces()
              .InstancePerLifetimeScope();
});

還可以進行選擇性批量注入,注入之后通過 構造函數或者屬性注入的方式使用。
.net core 3.1 使用autofac注入,不同點只在於 Program 中的注冊方式。

3. AutoFac中常用方法說明

基本概念

1、AsImplementedInterfaces() 是以接口方式進行注入,注入這些類的所有的公共接口作為服務

2、InstancePerRequest() 每次請求共享同一個實例,使用ef時,使不同的操作使用同一個數據上下文

3、PreserveExistingDefaults() 如果不止一個組件暴露了相同的服務, Autofac將使用最后注冊的組件作為服務的提供方,那么使用PreserveExistingDefaults防止后面注冊的覆蓋前面注冊的

builder.Register<A>() .As<IA>();

builder.Register<AA>() .As<IA>();  // 這樣AA就會覆蓋A

builder.Register<AA>() .As<IA>().PreserveExistingDefaults(); // 這樣A是IA的默認值,不會被AA覆蓋   

4、InstancePerDependency為每個依賴或者調用(Resolve())都創建一個新的對象,唯一的實例

5、SingleInstance 為每次請求都使用同一個對象,單例模式.告訴容器,是個單例,但這個單例不用自己實現。

6、RegisterGeneric 對泛型類進行注冊

builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>))

7、RegisterInstance() 注冊一個實例,比如: 對已經存在的對象的實例進行注冊,這樣可以使實例轉化為由容器托管的實例

8、RegisterControllers() 注冊Controllers

builder.RegisterControllers(Assembly.GetExecutingAssembly()); // 注冊當前程序集中的所有Controllers  

9、RegisterFilterProvider() 注冊Filter過濾器

builder.RegisterFilterProvider()

10、RegisterAssemblyTypes 注冊類

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()); // 注冊了當前程序集內的所有的類

11、InstancePerMatchingLifetimeScope 在一個做標識的生命周期域中,每一個依賴或調用創建一個單一的共享的實例。打了標識了的生命周期域中的子標識域中可以共享父級域中的實例

builder.RegisterType<A>() .AsImplementedInterfaces() .InstancePerMatchingLifetimeScope();

12、InstancePerHttpRequest在一次Http請求上下文中,共享一個組件實例。僅適用於asp.net mvc開發

13、InstancePerLifetimeScope在一個生命周期中,每一次的依賴組件或調用(Resolve())創建一個單一的共享的實例,且每一個不同的生命周期域,實例是不同的

14、UsingConstructor(參數) 自動裝配,手動使用特定的構造函數

builder.RegisterType<A>().UsingConstructor(typeof(IA),typeof(IAA)); // 這樣指定調用的是A(IA,IAA)的構造函數,如果該構造函數不存在則報錯

15、[AsClosedTypesOf(open)]AsClosedTypesOf(typeof(IA<>)): 如果是多繼承的話,注冊的程序集所對應的服務(接口)是離這個類最近的開放的泛型實例(接口)

builder.RegisterAssemblyTypes(A).AsClosedTypesOf(typeof(IRepository<>));

Autofac中涉及的生命周期

//1、瞬時生命周期:注冊之后,每次獲取到的服務實例都不一樣(默認的注冊方式)
containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerDependency();
//2、單例生命周期:整個容器中獲取的服務實例都是同一個
containerBuilder.RegisterType<UserService>().As<IUserService>().SingleInstance();
//3、作用域生命周期:在相同作用域下獲取到的服務實例是相同的
containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();
//4、作用域生命周期:可以指定到某一個作用域,然后在相同作用域下共享服務實例
containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerMatchingLifetimeScope("My");
//5、http請求上下文的生命周期:在一次Http請求上下文中,共享一個組件實例。僅適用於asp.net mvc開發。
containerBuilder.RegisterType<UserService>().As<IUserService>().InstancePerRequest();
//6、擁有隱式關系類型的創建新的嵌套生命周期的作用域,在一個生命周期域中所擁有的實例創建的生命周期中,
//  每一個依賴組件或調用Resolve()方法創建一個單一的共享的實例,並且子生命周期域共享父生命周期域中的實例
containerBuilder.RegisterType<UserService>().InstancePerOwned<IUserService>(); 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM