gpt4 book ai didi

unity-container - Unity 和构造函数

转载 作者:行者123 更新时间:2023-12-04 06:40:21 26 4
gpt4 key购买 nike

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

编辑

我的意思是说:

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

最佳答案

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

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

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

编辑:

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

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

关于unity-container - Unity 和构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4336246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com