gpt4 book ai didi

unity-container - 如何使用 Unity 2 XML 配置注入(inject)对象的通用 IList<>?

转载 作者:行者123 更新时间:2023-12-04 06:43:08 25 4
gpt4 key购买 nike

我需要注入(inject) IList<IActivity> 类型的集合进入构造函数。我正在使用 Unity 2.0 并使用 XML 对其进行配置。

我可以通过在 Unity 1.2 中注入(inject)一个数组来做到这一点。我刚刚升级到 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>

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

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

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

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

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

最佳答案

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

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

这应该足够了,我希望这有效;-)
最好的祝福,
赫伯

关于unity-container - 如何使用 Unity 2 XML 配置注入(inject)对象的通用 IList<>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3996267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com