Unity配置向后工作
本文关键字:工作 配置 Unity | 更新日期: 2023-09-27 18:03:26
我有以下配置:
<?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 . practicesunity . resolutionfailedexception:解决依赖项失败,类型= "CommonLib。IInjectMe1", name = "(none)"。在解析时发生异常。异常是:InvalidOperationException -当前类型,CommonLib。IInjectMe1是一个接口,不能被构造。您是否错过了类型映射?
手头没有编译器,但我怀疑您必须从XML中删除name="Injected1"
通过创建命名注册,您约束自己使用命名解析。但显然,您解决了默认注册