【问题标题】:Unity config working backwardsUnity 配置向后工作
【发布时间】:2023-04-06 16:39:01
【问题描述】:

我有以下配置:

<?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&lt;IInjectMe1&gt;() 工作。注意接口的 I。

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

测试方法 CommonLib.Tests.UnitTest1.TestMethod1 抛出异常: Microsoft.Practices.Unity.ResolutionFailedException:依赖项解析失败,类型 =“CommonLib.IInjectMe1”,名称 =“(无)”。 异常发生时:解决时。 异常是: InvalidOperationException - 当前类型 CommonLib.IInjectMe1 是一个接口,无法构造。您是否缺少类型映射?

【问题讨论】:

  • 你不必,你可以指定接口。 container.Resolve&lt;IInjectMe1&gt;() 有错误吗?
  • 是:var test1 = container.Resolve();给我错误:依赖项解析失败,类型=“CommonLib.IInjectMe1”,名称=“(无)”。
  • 从您的 xml 配置中删除 name="injected1"。

标签: c# unity-container


【解决方案1】:

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

通过创建命名注册,您将自己限制为命名解析。但显然,您解决了默认注册。

【讨论】:

  • 明白了。我发现文档有点零散,因此从各种来源中提取了一些示例。我一点也不高兴添加一个名称会从根本上改变它的运作方式。这似乎不合逻辑。
  • 真的很方便。命名注册允许您有条件注册,按名称解析。
  • 是的,我正在慢慢了解它的构造方式。有很大的力量,我希望一些拦截的东西能很好地工作。
  • 以防万一有人遇到与文档相同的问题,我刚刚找到了正确的 codeplex 页面。 unity.codeplex.com/releases
猜你喜欢
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2023-02-10
  • 2011-07-29
  • 2023-03-19
相关资源
最近更新 更多