代码之家  ›  专栏  ›  技术社区  ›  Jerry

Unity框架:如何从同一个接口实例化两个类?

  •  2
  • Jerry  · 技术社区  · 17 年前

    我有一个接口,有两个类实现它,我需要加载每个类,但unity有:

    m_unityContainer。Resolve()//接口IGeneric在哪里

    我的配置看起来像:

          <type type="IGeneric" mapTo="ClassA">
          </type>
          <type type="IGeneric" mapTo="ClassB">
          </type>
    

    有什么想法吗?

    谢谢

    5 回复  |  直到 17 年前
        1
  •  2
  •   Schalk    17 年前

    您还可以使用通用接口,如下所示:

    public interface IGeneric{}
    
    public interface IGeneric<T> : IGeneric{}
    

    那就来一杯吧 类型安全 接口的解决方案:

    container.RegisterType<IGeneric<ClassA>, ClassA>();
    container.RegisterType<IGeneric<ClassB>, ClassB>();
    
    ClassA classA = container.Resolve<IGeneric<ClassA>>();
    ClassB classB = container.Resolve<IGeneric<ClassB>>();
    

    当你沿着这条路走下去的时候,一些有趣的事情开始发生。。。

        2
  •  1
  •   gcores    17 年前

    这将为您提供实现IGeneric的所有注册类。

    IEnumerable<IGeneric> objects = container.ResolveAll<IGeneric>();
    
        3
  •  0
  •   Jerry Jerry    17 年前

    我找到了解决方案,每个条目都必须使用name属性:




    代码看起来像 obj=容器。ResolveAll(“A类”);

        4
  •  0
  •   kennyboy kennyboy    17 年前

    沙尔克-看起来不错。用什么符号来表示统一。配置?

        5
  •  0
  •   granadaCoder    13 年前

    这里有一个稍微不同的方法。我用的是团结。2.1.505.2(以防万一)。

      <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
      </configSections>
    
    
          <unity>
            <container>
              <register type="IVehicle" mapTo="Car" name="myCarKey" />
              <register type="IVehicle" mapTo="Truck" name="myTruckKey" />
            </container>
          </unity>
    

    这是DotNet代码。

            UnityContainer container = new UnityContainer();
    
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
            section.Configure(container);
    
    
    IVehicle v1 = container.Resolve<IVehicle>("myCarKey"); 
    
    IVehicle v2 = container.Resolve<IVehicle>("myTruckKey"); 
    

    见:

    http://msdn.microsoft.com/en-us/library/ff664762(v=pandp.50).aspx