用Unity填充集合的方法

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)

  • 名称参数是关键! (3认同)