AutoFac 生命周期


InstancePerDependency (默認的) 每一次Resolve創建一個不同對象出來

SingleInstance 單一的,同一個對象

InstancePerLifetimeScope 同一個生命周期獲得一樣的對象,不同周期有不同對象(想想httpContxt)

ContainerBuilder.Build() 是從IContainer中接口中繼承 而IContainer從ILifetimeScope而來

ILifetimeScope 也可以自己構造 ,從現在IContainer 彈射更遠的范圍 IContainer.BeginLifetimeScope();

或這樣的 (ILifetimeScope)HttpContext.Current.Items[typeof(ILifetimeScope)](ILifetimeScope 難道是key、value的方式存??,具體原碼沒有研究)

以下代碼

 

 var builder = new ContainerBuilder();
            builder.RegisterType<SqlDatabase>().As<IDatabase>().Keyed<IDatabase>("SqlDatabase").InstancePerDependency();
            builder.RegisterType<MySqlDatabase>().As<IDatabase>().Keyed<IDatabase>("MySqlDatabase").InstancePerLifetimeScope();
            builder.RegisterType<OracleDatabase>().As<IDatabase>().Keyed<IDatabase>("OracleDatabase").SingleInstance();
            builder.RegisterType<DatabaseManager>().WithParameter(ResolvedParameter.ForKeyed<IDatabase>("SqlDatabase"));
            using (var container = builder.Build())
            {
                
                var sqlDatabase1 = container.ResolveKeyed<IDatabase>("SqlDatabase");
                var sqlDatabase2 = container.ResolveKeyed<IDatabase>("SqlDatabase");
                var or1 = container.ResolveKeyed<IDatabase>("OracleDatabase");
                var or2 = container.ResolveKeyed<IDatabase>("OracleDatabase");
                var m1 = container.ResolveKeyed<IDatabase>("MySqlDatabase");
                var m2 = container.ResolveKeyed<IDatabase>("MySqlDatabase");
                ILifetimeScope inner = container.BeginLifetimeScope();
                var s1 = inner.ResolveKeyed<IDatabase>("SqlDatabase");
                var s2 = inner.ResolveKeyed<IDatabase>("SqlDatabase");
                var m3 = inner.ResolveKeyed<IDatabase>("MySqlDatabase");
                var m4 = inner.ResolveKeyed<IDatabase>("MySqlDatabase");
                var o1 = inner.ResolveKeyed<IDatabase>("OracleDatabase");
                var o2 = inner.ResolveKeyed<IDatabase>("OracleDatabase");
                Debug.WriteLine(string.Format("container SqlDatabase={0}", object.ReferenceEquals(sqlDatabase1, sqlDatabase2)));
                Debug.WriteLine(string.Format("container MySqlDatabase={0}", object.ReferenceEquals(m1, m2)));
                Debug.WriteLine(string.Format("container OracleDatabase={0}", object.ReferenceEquals(or1, or2)));
                Debug.WriteLine(string.Format("inner. SqlDatabase ={0}", object.ReferenceEquals(s1, s2)));
                Debug.WriteLine(string.Format("inner MySqlDatabase={0}", object.ReferenceEquals(m3, m4)));
                Debug.WriteLine(string.Format("inner OracleDatabase={0}", object.ReferenceEquals(o1, o2)));
                Debug.WriteLine(string.Format("container MySqlDatabase 與inner MySqlDatabase={0} ", object.ReferenceEquals(m1, m4)));
                Debug.WriteLine(string.Format("container SqlDatabase 與inner SqlDatabase={0} ", object.ReferenceEquals(sqlDatabase1, s1)));
                Debug.WriteLine(string.Format("container OracleDatabase 與inner OracleDatabase={0} ", object.ReferenceEquals(or1, o1)));

無論是Autofac 還是spring.net 還是其它的IOC這樣的工具,不是萬能的,它僅僅是解決了類的創建的設計模式,類的創建時間和方式,與傳統的配置文件創建方式(load assembly ,Activator)有很多優勢,一,效率,(傳統方式效率不高,無論emit還是delagate)二、有着生命周期,三、方便性,使用很方便

而在程 序結構上我們還需設計好自己結構的設計模式。個人意見,歡迎指正。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM