回到目錄
這個根據類型字元串動态去生産一個接口的對象,在實作項目中用途很廣,這即省去了配置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是我們使用這些功能的前提和基礎!
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!
