C# Unity 對於泛型介面的支援

來源:互聯網
上載者:User

標籤:

最近和小夥伴們在做一個前台小架構, 已經有些人用起來了。 但是之前架構沒有引入 Ioc, 所以使用者實現我們架構開放出去的介面後,我們只能通過反射來擷取使用者的實作類別。這樣一個問題就是我們雖然定義了介面, 但其實我們依然依賴於使用者的實現,同時架構啟動異常的慢。 所以我們打算使用開源 Ioc 架構來把完成依賴注入的動作。 我們就完全關心我們自己的介面, 然後使用者可以自己把實作類別注入到架構中來,這樣不僅移除了依賴,同是也砍掉了反射,可以加快載入速度。

因為開放的介面中定義了泛型介面,所以選中支援泛型介面的 Unity 來完成 Ioc 功能。 下面一步步實現一個簡單的 Unity 泛型介面執行個體。 

首先定義三個項目:

  1. UnityPrimer 架構代碼
  2. UnityPrimerClient 架構使用者代碼
  3. UnityPrimerInterfaces 架構介面

項目結構


架構介面包含:

  1. 實體介面
    1. namespace UnityPrimerInterfaces.Interfaces{    public interface IModel    {        string Name { get; set; }    }}


  2. 泛型介面
    1. namespace UnityPrimerInterfaces.Interfaces{    public interface IEnricher<T> where T:IModel    {        T StringToModel(string message);        string ModelToString(T model);    }}



架構使用者實現代碼:實現架構定義的介面,並且把實現執行個體注入到容器中。

  1. 介面實現
    1.  public class Model :IModel    {        private string name;        public string Name        {            get            {                return name;            }            set            {                name = value;            }        }    }


    2. public class Enricher<T> : IEnricher<T> where T:IModel    {        public T StringToModel(string message)        {            var model =new Model() { Name = message };            return (T)((IModel)model);        }        public string ModelToString(T model)        {            return model.Name;        }    }


  2. 註冊器
    1. namespace UnityPrimerClient{    public class Register    {        public static IUnityContainer Container;        public static void Regist()        {            Container = new UnityContainer();            Container.RegisterType(typeof(IEnricher<>), typeof(Enricher<>), "Sample");            //Container.RegisterType(typeof(IEnricher<IModel>), typeof(Enricher<Model>), "Sample");            //Container.RegisterInstance<IEnricher<IModel>>(new Enricher<Model>());        }    }}


架構代碼:架構從容器中擷取使用者實現的對象,並進行操作。 

  1. namespace UnityPrimer{    class Program    {        static void Main(string[] args)        {            Register.Regist();            var enricher = Register.Container.Resolve<IEnricher<IModel>>("Sample");            IModel model = enricher.StringToModel("SampleModel");            Console.WriteLine(enricher.ModelToString(model));            Console.ReadLine();        }    }}


對於 Unity 來說,最容易出錯的部分,就是 register 和 resolve 的時候。同是對於泛型介面,泛型約束會導致resolve失敗。

C# Unity 對於泛型介面的支援

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.