Unity配置向后工作

时间:2013-03-10 21:46:58

标签: c# unity-container

我有以下配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity1" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
    <section name="unity2" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity1 configSource="unity1.config" />
  <unity2 configSource="unity2.config" />
</configuration>

以及unity1文件中的以下内容(unity2是相同的,但在显而易见的地方有2而不是1。

<?xml version="1.0" encoding="utf-8" ?>
<unity1 xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <alias alias="IInjectMe1" type="CommonLib.IInjectMe1, CommonLib"/>
  <container name="unity1">
    <register type="IInjectMe1" name="Injected1" mapTo="CommonLib.InjectMe1, CommonLib" />
  </container>
</unity1>

我将此代码放在名为CommonLib的程序集中的单个类文件中:

        public void StartUp()
    {
        var config1 = (UnityConfigurationSection)ConfigurationManager.GetSection("unity1");
        IUnityContainer container = new UnityContainer();
        config1.Configure(container, "unity1");

        var config2 = (UnityConfigurationSection)ConfigurationManager.GetSection("unity2");
        config2.Configure(container, "unity2");

        var test1 = container.Resolve<InjectMe1>(); // WHY NOT THE INTERFACE??

        var test2 = container.Resolve<InjectMe2>(); // WHY NOT THE INTERFACE??

        Console.WriteLine(test1 != null && test2 != null);
    }
}

public class InjectMe1 : IInjectMe1 {}

public interface IInjectMe1 {}

public class InjectMe2 : IInjectMe2 {}

public interface IInjectMe2 {}

我的问题是,上面我说“为什么不是界面”为什么我必须指定具体的类而不是界面?我确定它已经很晚了,我看不到树木的木材,但我必须指定具体的类型,它会创造出正确的混凝土类型。我想指定界面并让它解决。

我希望container.Resolve<IInjectMe1>()能够运作。注意I for interface。

编辑:如果我执行上述操作,则会收到错误消息:

  

测试方法CommonLib.Tests.UnitTest1.TestMethod1抛出异常:   Microsoft.Practices.Unity.ResolutionFailedException:依赖项的解析失败,type =“CommonLib.IInjectMe1”,name =“(none)”。   在解决时发生异常:   异常是:InvalidOperationException - 当前类型CommonLib.IInjectMe1是一个接口,无法构造。你错过了类型映射吗?

1 个答案:

答案 0 :(得分:1)

手头没有编译器,但我怀疑你必须从XML中删除name =“Injected1”。

通过创建命名注册,您可以将自己约束为命名解析。但显然,您解决了默认注册问题。