• Autofac IOC 依赖注入方式和生命周期以及Autofac配置文件配置IOC属性注入


    Autofac IOC 依赖注入方式和生命周期以及Autofac配置文件配置IOC属性注入

    Autofac IOC 依赖注入方式:构造函数(默认),属性,方法,属性(1、接口实现类的属性注入,2、Controller控制器中的属性注入)

    Autofac IOC 生命周期以 :瞬态(InstancePerDependency),单例(SingleInstance),作用域(InstancePerLifetimeScope),作用域(标志)(InstancePerMatchingLifetimeScope("标志")), 请求(PerRequest)等

    Autofac IOC 依赖注入方式和生命周期以及Autofac配置文件配置IOC属性注入 代码如下:

    #region IOC TestIOC
            public static void TestIOC()
            {
                Console.WriteLine($"测试---IOC");
                ContainerBuilder builder = new ContainerBuilder();
    
                #region Autofac默认都是构造函数注入
                ////Autofac默认都是构造函数注入
                //builder.RegisterType<TestA>().As<ITestA>().InstancePerDependency();//瞬态
                //builder.RegisterType<TestB>().As<ITestB>().SingleInstance();//单例
                //builder.RegisterType<TestC>().As<ITestC>().InstancePerLifetimeScope();//作用域,应用域
                //builder.RegisterType<TestD>().As<ITestD>().InstancePerMatchingLifetimeScope("TEST");////指定作用域,指定应用域
    
                ////Autofac接口服务使用属性注入----PropertiesAutowired属性注入----接口中的实现类中的其他接口服务的属性注入
                //builder.RegisterType<TestE>().As<ITestE>().InstancePerMatchingLifetimeScope("TEST123").PropertiesAutowired();//指定作用域,指定应用域
                #endregion
    
                #region Autofac Controller控制器中接口服务使用属性注入----PropertiesAutowired属性注入----接口中的实现类中的其他接口服务的属性注入
                ////Autofac Controller控制器中接口服务使用属性注入----PropertiesAutowired属性注入----接口中的实现类中的其他接口服务的属性注入
                ////containerBuilder.RegisterType<HHController>().As<ControllerBase>().InstancePerMatchingLifetimeScope("TEST123").PropertiesAutowired();//指定作用域,指定应用域
                //public void ConfigureServices(IServiceCollection services)中添加如下
                //控制器属性注入,默认ioc容器之创建接口服务,控制器的创建是由IControllerActivator创建的,现在使用ioc容器创建ServiceBasedControllerActivator
                //services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
    
                //public void ConfigureContainer(ContainerBuilder containerBuilder)中添加如下
                //var types = this.GetType().Assembly.ExportedTypes.Where(t => typeof(ControllerBase).IsAssignableFrom(t)).ToArray();
                ////注册所有controller,PropertiesAutowired 属性注入所有的接口服务以及自定义特性CustomPropAttribute区分标记和自定义属性选择器MyPropertySelector
                //containerBuilder.RegisterTypes(types).PropertiesAutowired(new MyPropertySelector()); 
                #endregion
    
                #region 使用方法注入----接口中的实现类中的其他接口服务的属性注入
                ////使用方法注入----接口中的实现类中的其他接口服务的属性注入
                //builder.RegisterType<TestG>().OnActivated(t => t.Instance.MethodInject(t.Context.Resolve<ITestB>())).As<ITestG>().InstancePerMatchingLifetimeScope("TEST456").PropertiesAutowired();//指定作用域,指定应用域
                #endregion
    
    
                #region Autofac 配置文件 配置IOC 依赖注入 属性注入
                ////Autofac 配置文件 配置IOC 依赖注入 属性注入
                ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
                configurationBuilder.Add(new JsonConfigurationSource() { Path = "Config/autofacconfig.json", Optional = false, ReloadOnChange = true });
                var conmodule = new ConfigurationModule(configurationBuilder.Build());
                builder.RegisterModule(conmodule); 
                #endregion
    
                var contaier = builder.Build();
                var testA = contaier.Resolve<ITestA>();
                testA.Show();
                var testA1 = contaier.Resolve<ITestA>();
                testA1.Show();
                var testB = contaier.Resolve<ITestB>();
                testB.Show();
                var testB1 = contaier.Resolve<ITestB>();
                testB1.Show();
                Console.WriteLine($"瞬态:{object.ReferenceEquals(testA, testA1)}");
    
                #region 作用域
                #region 方法注入  InstancePerMatchingLifetimeScope使用作用域及子作用域,匹配作用域,只有一个实例,无论是父子作用域还是父下面的不同子作用域他们的实例都是相同的
                //using var scope = contaier.BeginLifetimeScope("TEST456");
                //var testG = scope.Resolve<ITestG>();
                //testG.Show();//测试方法注入
                #endregion
    
                #region 属性注入  InstancePerMatchingLifetimeScope使用作用域及子作用域,匹配作用域,只有一个实例,无论是父子作用域还是父下面的不同子作用域他们的实例都是相同的
    
                //using var scope = contaier.BeginLifetimeScope("TEST123");
                //var testE = scope.Resolve<ITestE>();
                //testE.Show();//测试属性注入
    
                #endregion
    
                #region 属性注入 InstancePerMatchingLifetimeScope使用作用域及子作用域,匹配作用域,只有一个实例,无论是父子作用域还是父下面的不同子作用域他们的实例都是相同的
                //ITestD testD5;
                //ITestD testD6;
                //ITestD testD7;
                //using var scope = contaier.BeginLifetimeScope("TEST");
                //var testD = scope.Resolve<ITestD>();
                ////var testA = scope.Resolve<ITestA>();//测试属性注入
                ////testA.Show();
                //testD.Show();//测试属性注入
                //testD5 = testD;
    
                ////子作用域
                //using var scope1 = scope.BeginLifetimeScope();
                //var testD1 = scope1.Resolve<ITestD>();
                //var testD11 = scope1.Resolve<ITestD>();
                //testD6 = testD1;
                //Console.WriteLine($"子作用域内部:{object.ReferenceEquals(testD1, testD11)}");
    
                ////子作用域
                //using var scope2 = scope.BeginLifetimeScope();
                //var testD2 = scope2.Resolve<ITestD>();
                //testD7 = testD2;
                //var testD21 = scope2.Resolve<ITestD>();
                //Console.WriteLine($"子作用域内部:{object.ReferenceEquals(testD2, testD21)}");
    
                //Console.WriteLine($"作用域及子作用域:{object.ReferenceEquals(testD5, testD6)}");
                //Console.WriteLine($"不同子作用域对比:{object.ReferenceEquals(testD6, testD7)}");
                #endregion
    
                #region InstancePerLifetimeScope使用作用域及子作用域
                //ITestC testC5;
                //ITestC testC6;
                //ITestC testC7;
                //using var scope = contaier.BeginLifetimeScope();
                //var testC = scope.Resolve<ITestC>();
                //testC5 = testC;
    
                ////子作用域
                //using var scope1 = scope.BeginLifetimeScope();
                //var testC1 = scope1.Resolve<ITestC>();
                //var testC11 = scope1.Resolve<ITestC>();
                //testC6 = testC1;
                //Console.WriteLine($"子作用域内部:{object.ReferenceEquals(testC1, testC11)}");
    
                ////子作用域
                //using var scope2 = scope.BeginLifetimeScope();
                //var testC2 = scope2.Resolve<ITestC>();
                //testC7 = testC2;
                //var testC21 = scope2.Resolve<ITestC>();
                //Console.WriteLine($"子作用域内部:{object.ReferenceEquals(testC2, testC21)}");
    
                //Console.WriteLine($"作用域及子作用域:{object.ReferenceEquals(testC5, testC6)}");
                //Console.WriteLine($"不同子作用域对比:{object.ReferenceEquals(testC6, testC7)}");
                #endregion
    
                #region InstancePerLifetimeScope使用同一作用域及不同作用域
                //ITestC testC5;
                //ITestC testC6;
                //using var scope1 = contaier.BeginLifetimeScope();
                //var testC = scope1.Resolve<ITestC>();
                //testC.Show();
                //testC5 = testC;
                //var testC1 = scope1.Resolve<ITestC>();
                //testC1.Show();
                //Console.WriteLine($"相同作用域:{object.ReferenceEquals(testC, testC1)}");
    
                //using var scope2 = contaier.BeginLifetimeScope();
                //var testC3 = scope2.Resolve<ITestC>();
                //testC3.Show();
                //testC6 = testC3;
                //var testC4 = scope2.Resolve<ITestC>();
                //testC4.Show();
                //Console.WriteLine($"相同作用域:{object.ReferenceEquals(testC3, testC4)}");
    
                //Console.WriteLine($"不同作用域对比:{object.ReferenceEquals(testC5, testC6)}");
                #endregion
    
                #region InstancePerLifetimeScope使用作用域
                //using var scope = contaier.BeginLifetimeScope();
                //var testC = scope.Resolve<ITestC>();
                //testC.Show();
                //var testC1 = scope.Resolve<ITestC>();
                //testC1.Show();
                //Console.WriteLine($"作用域:{object.ReferenceEquals(testC, testC1)}");
                #endregion
    
                #region InstancePerLifetimeScope默认作用域单例
                //var testC = contaier.Resolve<ITestC>();
                //testC.Show();
                //var testC1 = contaier.Resolve<ITestC>();
                //testC1.Show(); 
                //Console.WriteLine($"作用域:{object.ReferenceEquals(testC, testC1)}");
                #endregion
                #endregion
    
                #region 单例
                //var testB = contaier.Resolve<ITestB>();
                //testB.Show();
                //var testB1 = contaier.Resolve<ITestB>();
                //testB1.Show();
                //Console.WriteLine($"单例:{object.ReferenceEquals(testB, testB1)}");
                #endregion
    
                #region 瞬态
                //var testA = contaier.Resolve<ITestA>();
                ////testA.Show();
                //var testA1 = contaier.Resolve<ITestA>();
                ////testA1.Show();
                //Console.WriteLine($"瞬态:{object.ReferenceEquals(testA,testA1)}"); 
                #endregion
    
                Console.WriteLine($"测试完成。。。");
            }
            /// <summary>
            /// autofac中自定义属性选择器类
            /// </summary>
            public class MyPropertySelector : IPropertySelector
            {
                public bool InjectProperty(PropertyInfo propertyInfo, object instance)
                {
                    return propertyInfo.GetCustomAttributes().Any(att => att.GetType() == typeof(CustomPropAttribute));
                }
            }
    
            /// <summary>
            /// 标记不同的属性--特性标记
            /// </summary>
            [AttributeUsage(AttributeTargets.Property)]
            public class CustomPropAttribute : Attribute
            {
            }
            #endregion

    Config/autofacconfig.json内容

     项目WebAppNet5添加autofac的Autofac 配置文件Config/autofacconfig.json配置IOC属性注入 
    1. Nuget程序管理包添加引用Autofac、 Autofac.Configuration、Autofac.Extensions.DependencyInjection
    2. autofacconfig.json 内容如下,并设置 复制到输出目录--》始终复制 生成操作--》内容

    Config/autofacconfig.json内容如下

    {
      "components": [
        {
          "type": "WebAppNet5.TestA,WebAppNet5",
          "services": [
            {
              "type": "WebAppNet5.ITestA,WebAppNet5"
            }
          ],
          "instanceScope": "per-dependency", //瞬态
          "injectProperty": true
        },
        {
          "type": "WebAppNet5.TestB,WebAppNet5",
          "services": [
            {
              "type": "WebAppNet5.ITestB,WebAppNet5"
            }
          ],
          "instanceScope": "single-instance",//单例
          "injectProperty": true
        },
        {
          "type": "WebAppNet5.TestC,WebAppNet5",
          "services": [
            {
              "type": "WebAppNet5.ITestC,WebAppNet5"
            }
          ],
          "instanceScope": "per-lifetime-scope", //作用域,选择项如:'single-instance', 'per-dependency' (the default), 'per-lifetime-scope', and 'per-request'.”
          "injectProperty": true
        }
      ]
    }

      

    测试如下:

    public class Program
        {
            static void Main(string[] args)
            {
               #region IOC TestIOC
               TestIOC();
               #endregion
               Console.Read();
            }
        }
    WebAppNet5
  • 相关阅读:
    纯html的table打印注意事项
    Silverlight:针式打印机文字模糊的改善办法
    C#执行XSL转换
    tomcat 新手上路
    跨浏览器的剪贴板访问解决方案
    打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机
    利用ActiveX实现web页面设置本地默认打印机、纸张大小
    前端工程化的理解
    算法注意---3、分治的本质
    算法与数据结构---4.9、最大子段和-dp空间优化
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/14173374.html
Copyright © 2020-2023  润新知