团结和构造者

时间:2010-12-02 14:50:15

标签: unity-container multiple-constructors

是否可以统一尝试所有已定义的构造函数,从具有大多数参数的构造函数开始,直到最不具体的构造函数(默认构造函数)?

修改

我的意思是:

foreach (var constructor in concrete.GetConstructorsOrderByParameterCount())
{
   if(CanFulfilDependencies(constructor))
   {
       UseConstructor(constructor);
       break;
   }
}

我不希望Unity只尝试使用大多数参数的构造函数。我希望它继续尝试,直到找到合适的构造函数。如果Unity默认情况下不提供此行为,是否可以创建扩展或能够执行此操作的内容?

修改2

我有一个有两个构造函数的类:

public class MyConcrete : ISomeInterface
{
    public MyConcrete (IDepend1 dep, IDepend2 dep2)
    {}

    public MyConcrete(IDepend1 dep)
    {}
}

该类存在于由多个项目使用的库中。在这个项目中,我想使用第二个构造函数。但Unity停止了,因为它无法通过第一个构造函数来实现依赖关系。并且我想要更改类,因为DI在其他项目中使用了第一个构造函数。

因此需要Unity尝试解析所有构造函数。

1 个答案:

答案 0 :(得分:3)

Unity将选择具有最多参数的构造函数,除非您使用[InjectionConstructor]属性显式标记构造函数,然后该属性将定义Unity要使用的构造函数。

当你说出合适的构造函数时;这在某种程度上取决于环境。例如,如果您总是希望保证在使用Unity时使用某个构造函数,请使用前面提到的属性,否则显式调用您想要使用的构造函数。

Unity“尝试”所有构造函数的意义何在?其目的是以分离的方式提供类型的实例。如果任何构造函数将创建类型的实例,为什么它会遍历构造函数?

修改

您可以通过使用child container允许在项目中使用具有最多参数的构造函数,该项目在其容器中没有对该类型的引用。这不会强制使用带有单个参数的构造函数,但它将允许具有2个参数的构造函数现在在项目中工作。

您也可以切换到全面使用单个构造函数并通过另一种形式的DI(Property Injection)强制其他接口,而不是构造函数注入...因此,基础适用于更有意义的项目