Unity容器實現自動註冊

如何建立Unity容器?app

首先NuGet搜索Unity, 該示例中使用的版本爲4.0.1spa

新建控制檯程序code

示例中使用常規操做, 建立一個IPay接口, 分別有兩個實現類: ApplePay、HuaweiPay, 它們分別實現了IPay接口, 以下所示:blog

public interface IPay
    {
        void Send();
    }
public class ApplePay : IPay
    {
        public void Send()
        {
            Console.WriteLine("ApplePay!");
        }
    }
 public class HuaWeiPay : IPay
    {
        public void Send()
        {
            Console.WriteLine("HuaWeiPay!");
        }
    }

建立Unity容器, 按照常規的註冊方式, 以下:接口

 IUnityContainer container = new UnityContainer();

 container.RegisterType<IPay, ApplePay>("ApplePay");
 container.RegisterType<IPay, HuaWeiPay>("HuaWeiPay");

RegisterType方法提供了手動參數, 主要用於區分IPay接口的, 不然默認爲最後一個註冊實現爲準。it

調用方式, 則以下所示:class

 container.Resolve<IPay>("ApplePay").Send();
 container.Resolve<IPay>("HuaWeiPay").Send();

 

實現自動註冊容器

該方法, 則好處不用於, 每次新建新的接口關係時, 必須手動去進行 RegisterType,  以下方法則實現自動註冊機制:搜索

 container.RegisterTypes(AllClasses.FromLoadedAssemblies(), WithMappings.FromAllInterfacesInSameAssembly,
               WithName.TypeName, WithLifetime.PerResolve);

RegisterTypes 的第三個參數爲 TypeName: 該參數默認爲實現接口的類名, 若是默認使用Default, 那麼在一個接口有多個實現的狀況下則沒法實現註冊。程序

注: 上例中, IPat 接口 分別被 ApplePay、HuaweiPay 所實現, 實際的應用中, 也可能會出現這種狀況, 不然, 能夠忽略。

 

 

比較, 完整示例代碼,以下所示:

            IUnityContainer container = new UnityContainer();

            container.RegisterTypes(AllClasses.FromLoadedAssemblies(), WithMappings.FromAllInterfacesInSameAssembly,
               WithName.Default, WithLifetime.PerResolve);

            //container.RegisterType<IPay, ApplePay>("ApplePay");
            //container.RegisterType<IPay, HuaWeiPay>("HuaWeiPay");
            
            container.Resolve<IPay>("ApplePay").Send();
            container.Resolve<IPay>("HuaWeiPay").Send();

            Console.ReadKey();
相關文章
相關標籤/搜索