【问题标题】:How to inject a generic IList<> of objects using Unity 2 XML config?如何使用 Unity 2 XML 配置注入对象的通用 IList<>?
【发布时间】:2010-10-22 11:17:35
【问题描述】:

我需要将IList&lt;IActivity&gt; 类型的集合注入到构造函数中。我正在使用 Unity 2.0 并使用 XML 对其进行配置。

我可以通过在 Unity 1.2 中注入一个数组来做到这一点。我刚刚升级到 Unity 2.0,我的配置现在已经停止在这个特定区域工作。 (我已经解决了架构的所有琐碎更改。)

我的构造函数如下所示:

public DoSomethingWorkflow(IList<IActivity> activityCollection)
{
  ...
}

我的配置如下所示:

<alias alias="IListOfIActivity" type="System.Collections.Generic.IList`1[[MyProject.IActivity, MyProject]], mscorlib"/>

<alias alias="IActivityArray" type="MyProject.IActivity[], MyProject" />

<register type="IWorkflow" mapTo="Workflow" name="DoSomethingWorkflow">
    <constructor>
      <param name="activityCollection" type="IListOfIActivity">
        <array>
          <dependency name="DoSomethingActivity1"/>
          <dependency name="DoSomethingActivity2"/>
        </array>
      </param>
    </constructor>     
</register>

如果我按上述方式运行配置,我会收到一条错误消息,提示“配置设置为注入数组,但类型 IList`1 不是数组类型”。

如果我将其更改为以前的工作方式(注入类型别名 IActivityArray),我会收到一条错误消息,指出“配置不正确,MyProject.Workflow 类型没有采用名为 activityCollection 的参数的构造函数”。

如果我从构造函数元素中完全删除 type 属性,我会收到与上面相同的错误消息。

我可以让它工作的唯一方法是将构造函数更改为接受 IActivity[] 数组。

那么这是 Unity 中的错误吗,因为数组是 IList 并且应该找到构造函数?还是我的配置中遗漏了什么?

【问题讨论】:

  • 太好了,我刚刚为这个获得了 Tumbleweed 徽章!有人可以帮忙吗?
  • 你有想过这个吗?

标签: unity-container


【解决方案1】:

其实你可以尝试应用别名而不是继承到新类型。

using  ActivityList=System.Collections.Generic.List<IActivity>;
//.... after some declarations
var activityList = new ActivityList();

我一直在阅读有关 Unity 配置文件的信息。我知道你可以创建别名,但我不确定如何指定泛型

顺便说一句,这篇文章解释了使用泛型的选项;-) http://dotnetslackers.com/articles/net/A-First-Look-at-Unity-2-0.aspx 我希望这会有所帮助

编辑

花了一些时间尝试使用它后,这是我的答案: List 假设您想使用从“IList”到“List”的解析。

1首先,您必须准备配置文件,在这种情况下,它使用对 IList 和 List 的签名引用。


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
  </configSections>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <alias alias="StringListContract" type="System.Collections.Generic.IList`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <alias alias="ConcreteStringList" type="System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <container>
      <register type="StringListContract" mapTo="ConcreteStringList">
        <lifetime type="ContainerControlledLifetimeManager" />
        <constructor />
      </register>
    </container>
  </unity>
</configuration>

2 使用容器解决依赖关系;-)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
namespace UnityTerminal
{


    class Program
    {
        static void Main(string[] args)
        {
            var container = new UnityContainer();
            container.LoadConfiguration();
            {
                var concreteStringList = container.Resolve<System.Collections.Generic.IList<System.String>>();
                concreteStringList.Add("Hello World");
            }
            {
                var concreteStringList = container.Resolve<System.Collections.Generic.IList<System.String>>();
                Console.WriteLine("{0}", concreteStringList[0]);
            }
            Console.ReadKey();
        }
    }
}

这应该足够了,我希望这有效 ;-) 此致, 赫伯

【讨论】:

    【解决方案2】:

    我要做的是创建一个派生自 IList&lt;IActivity&gt; 的类型 ActivityList。

    class ActivityList : IList<IActivity>
    { /* */ }
    

    配置文件中的这种东西:

    System.Collections.Generic.IList`1[[MyProject.IActivity, MyProject]], mscorlib
    

    很难理解和维护。

    【讨论】:

    • `1[[MyProject.IActivity, MyProject]] 的格式很难找到。感谢您发布此信息!不过,我同意这很难维护,但在某些情况下,别无选择:-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2011-07-04
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多