中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

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)前提和基礎!

回到目錄

 

posted @ 2016-04-19 14:42  張占嶺  閱讀(1172)  評論(2)    收藏  舉報