.NET CORE IOC容器和AutoFac 的用法
一 IOC默认的IOC的三种注入方式
通过构造函数获取到实例
二 使用AutoFac框架 注入
1.引用包
2.在 Program.cs
里替换系统默认容器
Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory())// // 使用 autofac 的容器工厂替换系统默认的容器 .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
3.在 Startup.cs
的 ConfigureServices
里替换控制器的替换规则
//替换控制器的替换规则 services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
4、创建 AutowiredAttribute.cs
,用于标识使用属性注入
[AttributeUsage(AttributeTargets.Property)] public class AutowiredAttribute : Attribute { }
5、创建 AutofacModule.cs
,注册服务
/// <summary> /// 容器注册类 /// </summary> public class AutofacModule:Autofac.Module { protected override void Load(ContainerBuilder builder) { // Register your own things directly with Autofac, like: builder.RegisterType<UserService>().As<IUserService>().InstancePerDependency().AsImplementedInterfaces(); // 获取所有控制器类型并使用属性注入 var controllerBaseType = typeof(ControllerBase); builder.RegisterAssemblyTypes(typeof(Program).Assembly) .Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType) .PropertiesAutowired(new AutowiredPropertySelector()); } }
public class AutowiredPropertySelector : IPropertySelector { public bool InjectProperty(PropertyInfo propertyInfo, object instance) { // 带有 AutowiredAttribute 特性的属性会进行属性注入 return propertyInfo.CustomAttributes.Any(it => it.AttributeType == typeof(AutowiredAttribute)); } }
6、在 Startup.cs
的 方法 ConfigureContainer
里注册上一步创建的 Module
类
public void ConfigureContainer(ContainerBuilder builder) { builder.RegisterModule(new AutofacModule()); }
7.使用效果
[Autowired] public IUserService _userService { get; set; }
属性注入很好用,但是要慎重使用,因为属性注入会造成类型的依赖关系隐藏,测试不友好等。
建议:在封闭框架时可以使用,但不能大范围使用,只有必须使用属性注入来达到效果的地方才会使用,用来提高使用框架时的编码效率,来达到一些便利,脱离框架层面,编写业务代码时,不得使用。
aotoface 推荐容器 支持特性注入 更好扩展
IOC 容器 集中注册一次修改,全局生效 让架构更稳定 一次修改