是否可以统一尝试所有已定义的构造函数,从具有大多数参数的构造函数开始,直到最不具体的构造函数(默认构造函数)?
修改
我的意思是:
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尝试解析所有构造函数。
答案 0 :(得分:3)
Unity将选择具有最多参数的构造函数,除非您使用[InjectionConstructor]
属性显式标记构造函数,然后该属性将定义Unity要使用的构造函数。
当你说出合适的构造函数时;这在某种程度上取决于环境。例如,如果您总是希望保证在使用Unity时使用某个构造函数,请使用前面提到的属性,否则显式调用您想要使用的构造函数。
Unity“尝试”所有构造函数的意义何在?其目的是以分离的方式提供类型的实例。如果任何构造函数将创建类型的实例,为什么它会遍历构造函数?
修改强>
您可以通过使用child container允许在项目中使用具有最多参数的构造函数,该项目在其容器中没有对该类型的引用。这不会强制使用带有单个参数的构造函数,但它将允许具有2个参数的构造函数现在在项目中工作。
您也可以切换到全面使用单个构造函数并通过另一种形式的DI(Property Injection)强制其他接口,而不是构造函数注入...因此,基础适用于更有意义的项目