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是一个接口,不能被构造。您是否错过了类型映射?

Unity配置向后工作

手头没有编译器,但我怀疑您必须从XML中删除name="Injected1"

通过创建命名注册,您约束自己使用命名解析。但显然,您解决了默认注册