2

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

编辑

我的意思是说:

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 需要尝试解析所有构造函数。

4

1 回答 1

3

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

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

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

编辑:

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

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

于 2010-12-02T14:55:56.407 回答