vit*_*dev 14 .net c# dependency-injection inversion-of-control unity-container
我有两个示例类
class ClassToResolve
{
private List<CollectionItem> _coll;
public ClassToResolve(List<CollectionItem> coll)
{
_coll = coll;
}
}
class CollectionItem
{
//...
}
Run Code Online (Sandbox Code Playgroud)
我需要解决ClassToResolve
var classToResolve = new ClassToResolve(
new List<CollectionItem>()
{
new CollectionItem(),
new CollectionItem(),
new CollectionItem()
}
);
Run Code Online (Sandbox Code Playgroud)
现在我以某种方式解决它
var classToResolve = new ClassToResolve(
new List<CollectionItem>()
{
unity.Resolve<CollectionItem>(),
unity.Resolve<CollectionItem>(),
unity.Resolve<CollectionItem>()
}
);
Run Code Online (Sandbox Code Playgroud)
有没有办法使用动态注册解析ClassToResolve?
Ste*_*ven 45
Unity会理解T[](数组)依赖项是一个事物列表(但不是IEnumerable<T>,也不是List<T>).当您更改的构造函数ClassToResolve取一个CollectionItem[],而不是一个List<CollectionItem>你可以配置你的CollectionItem类型如下:
container.RegisterType<CollectionItem, CollectionItemA>("a");
container.RegisterType<CollectionItem, CollectionItemB>("b");
container.RegisterType<CollectionItem, CollectionItemC>("c");
container.RegisterType<CollectionItem, CollectionItemD>("d");
Run Code Online (Sandbox Code Playgroud)
这里的诀窍是命名所有注册.默认(无名)注册永远不会成为Unity中序列依赖的一部分.
现在您可以ClassToResolve在不需要注册的情况下解决它:
container.Resolve<ClassToResolve>();
Run Code Online (Sandbox Code Playgroud)
如果您更愿意注入List<CollectionItem>,可以添加以下注册:
container.RegisterType<IList<CollectionItem>, CollectionItem[]>();
Run Code Online (Sandbox Code Playgroud)
并且IEnumerable<CollectionItem>您可以添加以下行:
container
.RegisterType<IEnumerable<CollectionItem>, CollectionItem[]>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8994 次 |
| 最近记录: |