回到目錄 這個根據類型字元串動態去生產一個介面的對象,在實現項目中用途很廣,這即省去了配置config文件的麻煩,又使用生產對象變更可配置,你完全可以把這種多態持久化到資料庫里或者XML文件里,在使用時根據類型名稱去生產對象的類型實例,非常爽,非常酷,當然也非常實用,大叔一直喜歡小平同志的話:黑貓, ...
這個根據類型字元串動態去生產一個介面的對象,在實現項目中用途很廣,這即省去了配置config文件的麻煩,又使用生產對象變更可配置,你完全可以把這種多態持久化到資料庫里或者XML文件里,在使用時根據類型名稱去生產對象的類型實例,非常爽,非常酷,當然也非常實用,大叔一直喜歡小平同志的話:黑貓,白貓,抓住耗子就是好貓!
現在使用我來講一個例子,也是編程里的一個Hello world的例子,傳說有IHello介面,它有China和USA兩種實現,什麼時候用它們完成由配置決定,程式里不能寫死
統一的人類
public interface IHello { void HelloWorld(); }
中國人說HelloWorld
public class China : IHello { public void HelloWorld() { Console.WriteLine("你好,世界!"); } }
美國人說HelloWorld
public class USA : IHello { public void HelloWorld() { Console.WriteLine("Hello World!"); } }
我們要想動態生產對象,有很多方法,也有很多第三方的IOC組件,向autofac,castle,unity都可以實現,在大叔框架里,比較青睞於Unity,所以我們還是以Unity為例,來生產一個這個對象
//IOC上下文,使用using自動進行Dispose using (IUnityContainer container = new UnityContainer()) { string helloType = "Lind.DDD.Test.China";//從配置文件或者資料庫里讀取信息 container.RegisterType(typeof(IHello), Type.GetType(helloType));//註意類型與實現的關係 var hello = container.Resolve<IHello>();//生產對象 hello.HelloWorld();//調用方法 }
結果當前是輸出中國人的Hello world!
有一點要註意一下,對不在本程式集里的類型,需要將程式集名稱寫清楚,如下
var t = Type.GetType("Lind.DDD.ConfigConstants.ConfigModel,Lind.DDD");//一般介面 var tGeneric = Type.GetType("Lind.DDD.Test.Hello`1,Lind.DDD.Test");//泛型介面
再次註意,如果泛型類型中,泛型的參數類型也不在本程式集,則需要使用下載的代碼了
tGeneric = Type.GetType("Lind.DDD.Repositories.Xml.XmlRepository`1,Lind.DDD.Repositories.Xml");//拿到泛型類型 tGeneric = tGeneric.MakeGenericType(typeof(Lind.DDD.ConfigConstants.ConfigModel));//註冊泛型叄數
最後註意,如果你不希望顯示的註冊泛型參數,也可以使用下載的代碼註冊方式,更優雅
tGeneric = Type.GetType("Lind.DDD.Repositories.Xml.XmlRepository`1[[Lind.DDD.ConfigConstants.ConfigModel,Lind.DDD]],Lind.DDD.Repositories.Xml");//拿到泛型類型
對於多語言的系統,也可以根據區域信息動態生產對象,當然IOC是我們使用這些功能的前提和基礎!