zoukankan      html  css  js  c++  java
  • Unity容器实现自动注册

    如何创建Unity容器?

    首先NuGet搜索Unity, 该示例中使用的版本为4.0.1

    新建控制台程序

    示例中使用常规操作, 创建一个IPay接口, 分别有两个实现类: ApplePay、HuaweiPay, 它们分别实现了IPay接口, 如下所示:

    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接口的, 否则默认为最后一个注册实现为准。

    调用方式, 则如下所示:

     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();
  • 相关阅读:
    解决使用git出现 The file will have its original line endings in your working directory
    SpringBoot集成flowable碰见DMN不能初始化
    CF268D Wall Bars
    CF1327F AND Segments
    P2900 [USACO08MAR]Land Acquisition G
    CF279B Books
    CF859E Desk Disorder
    CF1147B Chladni Figure
    CF1147E Rainbow Coins
    P3565 [POI2014]HOT-Hotels
  • 原文地址:https://www.cnblogs.com/zh7791/p/10445166.html
Copyright © 2011-2022 走看看