1. 程式人生 > 實用技巧 >Autofac IOC 依賴注入和生命週期

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

測試如下:

public class Program
    {
        static void Main(string[] args)
        {
           #region IOC TestIOC
           TestIOC();
           #endregion
           Console.Read();
        }
    }