使用 Unity 填充集合的方法 [英] Way to fill collection with Unity

查看:48
本文介绍了使用 Unity 填充集合的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个示例类

class ClassToResolve
{
    private List<CollectionItem> _coll;

    public ClassToResolve(List<CollectionItem> coll)
    {
        _coll = coll;
    }
}

class CollectionItem
{
    //...
}

我需要解析 ClassToResolve

and I need to resolve ClassToResolve

var classToResolve = new ClassToResolve(
            new List<CollectionItem>()
                {
                    new CollectionItem(),
                    new CollectionItem(),
                    new CollectionItem()
                }

            );

现在我以某种方式解决它

Now I resolve it in a way

var classToResolve = new ClassToResolve(
            new List<CollectionItem>()
                {
                    unity.Resolve<CollectionItem>(),
                    unity.Resolve<CollectionItem>(),
                    unity.Resolve<CollectionItem>()
                }
            );

有没有办法使用动态注册在 Unity 中解析 ClassToResolve?

Is there a way to resolve ClassToResolve with Unity using dynamic registration?

推荐答案

Unity 将理解 T[](数组)依赖项是一个事物列表(但不是 IEnumerable;,也不是 List).当您将 ClassToResolve 的构造函数更改为采用 CollectionItem[] 而不是 List 时,您可以配置您的 CollectionItem 类型如下:

Unity will understand that T[] (array) dependencies are a list of things (but not IEnumerable<T>, nor List<T>). When you change the constructor of ClassToResolve to take an CollectionItem[] instead of a List<CollectionItem> you can configure your CollectionItem types as follows:

container.RegisterType<CollectionItem, CollectionItemA>("a");
container.RegisterType<CollectionItem, CollectionItemB>("b");
container.RegisterType<CollectionItem, CollectionItemC>("c");
container.RegisterType<CollectionItem, CollectionItemD>("d");

这里的技巧是为所有注册命名.默认(无名)注册永远不会成为 Unity 中序列依赖项的一部分.

The trick here is to name all the registrations. A default (nameless) registration will never be part of a sequence dependency in Unity.

现在您无需注册即可解析ClassToResolve:

Now you can resolve ClassToResolve without the need to register it:

container.Resolve<ClassToResolve>();

如果您更愿意注入List,您可以添加以下注册:

If you rather inject List<CollectionItem> you can add the following registration:

container.RegisterType<IList<CollectionItem>, CollectionItem[]>();

对于 IEnumerable,您可以添加以下行:

And for IEnumerable<CollectionItem> you can add the following line:

container
  .RegisterType<IEnumerable<CollectionItem>, CollectionItem[]>();

这篇关于使用 Unity 填充集合的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆