.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 容器 集中注册一次修改,全局生效 让架构更稳定 一次修改

 

posted @ 2022-10-06 17:08  比特币大暴涨  阅读(104)  评论(0编辑  收藏  举报