如何建立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();