天天看點

IoC元件Unity再續~根據類型字元串動态生産對象

回到目錄

這個根據類型字元串動态去生産一個接口的對象,在實作項目中用途很廣,這即省去了配置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

支付寶掃一掃,為大叔打賞!

IoC元件Unity再續~根據類型字元串動态生産對象