IoC組件Unity再續~根(gen)據類型字符串(chuan)動態生產對象(xiang)
這個根據類型字符串動態去生產一個接口的對象,在實現項目中用途很廣,這即省去了配置config文件的麻煩,又使用生產對象變更可配置,你完全可以把這種多態持久化到數據庫里或者XML文件里,在使用時根據類型名稱去生產對象的類型實例,非常爽,非常酷,當然也非常實用,大叔一直喜歡小平同志的話:黑(hei)貓(mao),白貓(mao),抓住(zhu)耗子就(jiu)是好貓(mao)!
現(xian)在使用(yong)我來講(jiang)一個例子,也(ye)是(shi)編程里(li)的(de)一個Hello world的(de)例子,傳說有(you)(you)IHello接(jie)口(kou),它有(you)(you)China和USA兩種實現(xian),什么(me)時候用(yong)它們(men)完成(cheng)由配置決定(ding),程序里(li)不(bu)能寫(xie)死
統一(yi)的(de)人類
public interface IHello { void HelloWorld(); }
中(zhong)國人(ren)說(shuo)HelloWorld
public class China : IHello { public void HelloWorld() { Console.WriteLine("你好,世界(jie)!"); } }
美國人說HelloWorld
public class USA : IHello { public void HelloWorld() { Console.WriteLine("Hello World!"); } }
我們要想(xiang)動態生產(chan)對象(xiang),有(you)很多方法,也(ye)有(you)很多第三(san)方的IOC組件,向autofac,castle,unity都可以實現,在(zai)大(da)叔框(kuang)架里,比較青睞(lai)于Unity,所以我們還是以Unity為例,來生產(chan)一個這個對象(xiang)
//IOC上下文,使用using自(zi)動進行Dispose using (IUnityContainer container = new UnityContainer()) { string helloType = "Lind.DDD.Test.China";//從配置文(wen)件或者數據庫(ku)里讀(du)取信息 container.RegisterType(typeof(IHello), Type.GetType(helloType));//注意類型與實現的(de)關系 var hello = container.Resolve<IHello>();//生產(chan)對象 hello.HelloWorld();//調用方法 }
結果當前是輸出中國人的Hello world!
有一(yi)點要注意一(yi)下(xia),對不(bu)在(zai)本程(cheng)序(xu)集(ji)里的類型,需要將(jiang)程(cheng)序(xu)集(ji)名(ming)稱寫(xie)清楚,如下(xia)
var t = Type.GetType("Lind.DDD.ConfigConstants.ConfigModel,Lind.DDD");//一般接口 var tGeneric = Type.GetType("Lind.DDD.Test.Hello`1,Lind.DDD.Test");//泛型接(jie)口
再次注意(yi),如果(guo)泛(fan)型類型中,泛(fan)型的參數類型也不在(zai)本(ben)程(cheng)序集,則需(xu)要使(shi)用下載(zai)的代碼了
tGeneric = Type.GetType("Lind.DDD.Repositories.Xml.XmlRepository`1,Lind.DDD.Repositories.Xml");//拿到泛型類型 tGeneric = tGeneric.MakeGenericType(typeof(Lind.DDD.ConfigConstants.ConfigModel));//注冊泛型叁數
最后注意,如(ru)果(guo)你不希望顯示的注冊泛型參數(shu),也可(ke)以使(shi)用下(xia)載的代碼注冊方(fang)式,更優雅
tGeneric = Type.GetType("Lind.DDD.Repositories.Xml.XmlRepository`1[[Lind.DDD.ConfigConstants.ConfigModel,Lind.DDD]],Lind.DDD.Repositories.Xml");//拿到泛型類型
對于(yu)多語言的(de)系統(tong),也可(ke)以根據區域信息動態生(sheng)產對象,當然(ran)IOC是(shi)我們使用這些功能的(de)前提和基礎!