Autofac
(1)使用
-
NuGet 引入包Autofac.Extention
-
.net 6
program.cs 中 替換原生IOC容器, 此时原生的IOC容器中的东西被转移到Autofac里, 在ConfigureContainer
中不注册也行, 不是并行状态// 替换原生IOC容器 => autofac容器 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); -
.net 6
program.cs 中 使用autofac容器-
默认不写为瞬态
-
InstancePerLifetimeScope()
线程 -
.
SingleInstance()
单例
//使用autofac容器 builder.Host.ConfigureContainer<ContainerBuilder>(builder => { builder.RegisterType<服务接口实现类>().As<服务接口类>().注册状态(); }); -
-
使用
namespace SecondDemo.Controllers { [ApiController] [Route("/api/[controller]/[action]")] public class TestAutofacController : ControllerBase { public IUserService UserService { get; } public TestAutofacController(IUserService userService) { UserService = userService; } [HttpGet(Name = "TestAutofacUser", Order = 0)] public string Get() { return UserService.GetUserName(); } } }
-
使用服务提供者, 查看容器是替换还是并行
-
autofac替换前是
MicosoftExtension
包ServiceProviderEngineScope
-
替换后是
Autofac.Extension.DenpendencyInjection.AutoFacServiceProvider
-
public XxxController(IServceProvider, serviceProvider, IUserService userSerivce) { this.UserService = userService }
(2)泛型Service注入使用typeof()
public interface IBaseService<T> { string GetTName(); }
public class BaseService<T> : IBaseService<T> { /// <summary> /// 查找类的名字 /// </summary> /// <returns>返回泛型的名字</returns> public string GetTName() { return typeof(T).Name; } }
program.cs
-
autofac使用
RegisterGeneric
注入泛型
//原生注册泛型容器元素 builder.Services.AddTransient(typeof(IBaseService<>), typeof(BaseService<>)); //autofacf注入泛型容器元素 builder.Host.ConfigureContainer<ContainerBuilder>(builder => { builder.RegisterGeneric(typeof(BaseService<>)).As(typeof(IBaseService<>)); });
在开发时, 有一个习惯, 假如某个方法出现泛型类型, 就要在其下面写一个获取这个泛型的名称的方法
public class MyFactory { public string SetFactory<T>() { return SetFactory(type(T)); } //获取泛型名字 public string SetFactory(Type type) { return type.Name; } }
(3)autofac设置三种容器状态
-
默认不写为瞬态
-
InstancePerLifetimeScope()
线程 -
.
SingleInstance()
单例
//单例 builder.RegisterType<UserService>().As<IUserService>().SingleInstance(); //瞬态 builder.RegisterType<TransientService>().As<ITransientService>(); //线程 builder.RegisterType<SingletonService>().As<ISingletonService>().SingleInstance(); builder.RegisterType<ScopedService>().As<IScopedService>().InstancePerLifetimeScope();
(4)通过属性注入
1.开启属性注入
-
.PropertiesAutowired()
, 代表允许这个类中使用属性注入, 而不是代表这个类被属性注入
//使用autofac容器, 开启属性注入 builder.Host.ConfigureContainer<ContainerBuilder>(builder => { builder.RegisterType<Service1>().As<IService1>().PropertiesAutowired(); builder.RegisterType<Service2>().As<IService2>(); });
-
使用属性注入如下
public class Service1 : IService1 { public Service2 Service2 { get; set; } }
(4)扩展方法封装Program.cs
builder.Host.ConfigureContainer<ContainerBuilder>(builder => { builder.AddSecondDemoApiModel(); });
public static class AutofacExtentions { //扩展方法封装 public static void AddSecondDemoApiModel(this ContainerBuilder builder) { builder.RegisterType<UserService>().As<IUserService>().SingleInstance(); builder.RegisterType<TransientService>().As<ITransientService>(); builder.RegisterType<SingletonService>().As<ISingletonService>().SingleInstance(); builder.RegisterType<ScopedService>().As<IScopedService>().InstancePerLifetimeScope(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律