文章出處

回到目錄

這個根據類型字符串動態去生產一個接口的對象,在實現項目中用途很廣,這即省去了配置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是我們使用這些功能的前提和基礎!

回到目錄

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()