dependency-injection - 如何配置 Unity 为 IEnumerable 注入(inject)数组

标签 dependency-injection inversion-of-control unity-container constructor-injection

我有一门课需要 IEnumerable我想用 Unity 解析并注入(inject)对象数组的构造函数参数。这些简单的类说明了这个问题。

public interface IThing
{
    int Value { get; }
}

public class SimpleThing : IThing
{
    public SimpleThing()
    {
        this.Value = 1;
    }

    public int Value { get; private set; }
}

public class CompositeThing : IThing
{
    public CompositeThing(IEnumerable<IThing> otherThings)
    {
        this.Value = otherThings.Count();
    }

    public int Value { get; private set; }
}

说我要注入(inject)四个SimpleThing进入 CompositeThing .我已经尝试了以下 Unity 配置的几种变体。
<alias alias="IThing" type="TestConsoleApplication.IThing, TestConsoleApplication" />
<alias alias="SimpleThing" type="TestConsoleApplication.SimpleThing, TestConsoleApplication" />
<alias alias="CompositeThing" type="TestConsoleApplication.CompositeThing, TestConsoleApplication" />

<container>

  <register type="IThing" mapTo="SimpleThing" name="SimpleThing" />
  <register type="IThing" mapTo="CompositeThing" name="CompositeThing">
    <constructor>
      <param name="otherThings">
        <array>
          <dependency type="SimpleThing"/>
          <dependency type="SimpleThing"/>
          <dependency type="SimpleThing"/>
          <dependency type="SimpleThing"/>
        </array>
      </param>
    </constructor>
  </register>

</container>

但是我收到错误消息 配置设置为注入(inject)数组,但类型 IEnumerable`1 不是数组类型。 如果我将构造函数参数更改为 IThing[]它有效,但我不想那样做。我需要对我的 Unity 配置做些什么才能使其正常工作?

最佳答案

这是我找到的一个解决方案,但它有点笨拙。您需要一个包装类来帮助 Unity 识别数组是 IEnumerable .

public class ArrayWrapper<T> : IEnumerable<T>
{
    public ArrayWrapper(T[] things)
    {
        this.things = things;
    }

    private IEnumerable<T> things;

    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
        return this.things.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.things.GetEnumerator();
    }
}

然后,您可以使用 Ethan 的 EnumberableThing 将 Unity 配置为注入(inject)其中之一。主意。
<alias alias="IThing" type="TestConsoleApplication.IThing, TestConsoleApplication" />
<alias alias="SimpleThing" type="TestConsoleApplication.SimpleThing, TestConsoleApplication" />
<alias alias="CompositeThing" type="TestConsoleApplication.CompositeThing, TestConsoleApplication" />
<alias alias="EnumerableThing" type="System.Collections.Generic.IEnumerable`1[[TestConsoleApplication.IThing, TestConsoleApplication]], mscorlib"/>
<alias alias="ThingArrayWrapper" type="TestConsoleApplication.ArrayWrapper`1[[TestConsoleApplication.IThing, TestConsoleApplication]], TestConsoleApplication"/>

<container>
  <register type="EnumerableThing" mapTo="ThingArrayWrapper">
    <constructor>
      <param name="things">
        <array>
          <dependency type="SimpleThing"/>
          <dependency type="SimpleThing"/>
          <dependency type="SimpleThing"/>
          <dependency type="SimpleThing"/>
        </array>
      </param>
    </constructor>
  </register>

  <register type="IThing" mapTo="SimpleThing" name="SimpleThing" />

  <register type="IThing" mapTo="CompositeThing" name="CompositeThing">
    <constructor>
      <param name="otherThings" dependencyType="EnumerableThing" />
    </constructor>
  </register>
</container>

就像我说的那样,当你想要另一个 CompositeThing 时有点笨拙和尴尬三,五,六件事等。

当然,Unity 应该能够识别出一个数组是 IEnumberable。并注入(inject)它?

关于dependency-injection - 如何配置 Unity 为 IEnumerable 注入(inject)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8519709/

相关文章:

dependency-injection - EJB3 与数据访问对象

c# - .net 中功能/构建性能的最佳面向方面框架

java - 我如何创建一个对象类来执行从 Maven 存储库下载 .jar 依赖项

java - guice bean 初始化中的长时间操作

c# - 委托(delegate)可以注册到 CaSTLe Windsor IOC 容器吗?

angularjs - AngularJS Controller 定义中是否存在 $scope 依赖注入(inject)?

c# - 使用构造函数依赖注入(inject)检索文件的简单工厂

c# - DependencyResolver 不解析依赖关系。为什么?

c# - 如何在Unity中使用不同的构造函数注册两次相同的类型?

asp.net-mvc-3 - 将 Unity.Mvc3 与 HierarchicalLifetimeManager 和工作单元模式一起使用不再延迟加载