我有以下配置:
<?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。
编辑:如果我执行上述操作,我会收到错误:
测试方法 CommonLib.Tests.UnitTest1.TestMethod1 抛出异常:Microsoft.Practices.Unity.ResolutionFailedException:依赖项解析失败,类型 =“CommonLib.IInjectMe1”,名称 =“(无)”。异常发生时:解决时。异常是: InvalidOperationException - 当前类型 CommonLib.IInjectMe1 是一个接口,无法构造。您是否缺少类型映射?