2010-10-22 57 views
2

我需要将一个IList<IActivity>类型的集合注入到构造函数中。我正在使用Unity 2.0并使用XML进行配置。如何使用Unity 2 XML配置注入通用IList <>对象?

我能够通过在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属性,我会得到与上面相同的错误消息。

我能得到这个工作的唯一方法是改变构造函数来接受一个I​​Activity []数组。

所以这是在Unity中的错误,因为数组是一个IList,应该找到构造函数?或者我错过了我的配置中的东西?

+0

大,我刚刚拿到了这个的风滚草徽章!谁能帮忙? – freshr 2010-10-29 12:23:56

+0

你有没有想过这个? – 2011-09-19 06:54:48

回答

1

我会做的是创建一个从IList<IActivity>派生的类型ActivityList。

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

这种东西一个配置文件中:

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

是很难理解和维护。

+0

'[[MyProject.IActivity,MyProject]]的格式很难找到。感谢张贴这!不过,我同意,这很难维持,但在某些情况下,没有其他选择:-( – Pandincus 2012-02-14 21:20:48

2

实际上,您可以尝试应用别名而不是继承到新类型。

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

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

BTW这篇文章有一个解释的选项使用泛型;-) http://dotnetslackers.com/articles/net/A-First-Look-at-Unity-2-0.aspx 我希望这有助于

编辑

经过一段时间尝试使用它,这里是我的回答: 列表假设您想要使用从“IList”到“List”的解析。

首先,您将不得不准备好您的配置文件,在这种情况下,它使用对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> 

使用容器来解决依赖;-)

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(); 
     } 
    } 
} 

这应该是足够的,我希望这个作品;-) 最好的问候, 数量锐减

相关问题