这意味着当你有一个使用 DI 的类时,它必须只有一个构造函数,其中所有参数要么是注册的依赖项(或服务),要么具有默认值。
我注意到文档没有说明如果它确实会发生什么,但我认为它会抛出异常或以某种方式失败(例如,工厂方法返回null?)
文档还指出:
构造函数可以接受依赖注入未提供的参数,但参数必须分配默认值。
举个例子——如果我们有一个 DI 上下文可以提供这些服务:
IImageResizerService
IImageSavingService
IImageObjectRecognizerService
这没关系(单个可满足构造函数):
public class DefaultImageProcessingService : IImageProcessingService
{
public DefaultImageProcessingService
(
IImageResizerService resizer,
IImageSavingService saver,
IImageObjectRecognizerService recognizer,
String defaultFileName = null,
Int32 maxSaveAttempts = 3
)
{
this.resizer = resizer ?? throw new ArgumentNullException( nameof(resizer) );
this.saver = saver ?? throw new ArgumentNullException( nameof(saver) );
this.recognizer = recognizer?? throw new ArgumentNullException( nameof(recognizer) );
}
}
- 它只有 1 个构造函数
- 所有构造函数参数都是注册服务或具有默认值。
但这不行(多个可满足的构造函数):
public class DefaultImageProcessingService : IImageProcessingService
{
public DefaultImageProcessingService
(
IImageResizerService resizer,
String defaultFileName = null,
Int32 maxSaveAttempts = 3
)
{
this.resizer = resizer ?? throw new ArgumentNullException( nameof(resizer) );
}
public DefaultImageProcessingService
(
IImageSavingService saver,
IImageObjectRecognizerService recognizer,
String defaultFileName = null,
Int32 maxSaveAttempts = 3
)
{
this.saver = saver ?? throw new ArgumentNullException( nameof(saver) );
this.recognizer = recognizer?? throw new ArgumentNullException( nameof(recognizer) );
}
}
这是不可接受的,因为它有两个都将服务注册为参数的构造函数。所以 DI 工厂不知道要使用哪个构造函数,因为它可以使用其中任何一个。
这个例子也是不可接受的(单个不可满足的构造函数):
public class DefaultImageProcessingService : IImageProcessingService
{
public DefaultImageProcessingService
(
IImageResizerService resizer,
IImageSavingService saver,
IImageObjectRecognizerService recognizer,
IMysteryService mystery,
String defaultFileName = null,
Int32 maxSaveAttempts = 3
)
{
this.resizer = resizer ?? throw new ArgumentNullException( nameof(resizer) );
this.saver = saver ?? throw new ArgumentNullException( nameof(saver) );
this.recognizer = recognizer ?? throw new ArgumentNullException( nameof(recognizer) );
this.mystery = mystery ?? throw new ArgumentNullException( nameof(mystery) );
}
}
这是不可接受的,因为IMysteryService 未注册。
这没关系(多个构造函数,但正好1是可以满足的):
public class DefaultImageProcessingService : IImageProcessingService
{
public DefaultImageProcessingService
(
IImageResizerService resizer,
IImageSavingService saver,
IImageObjectRecognizerService recognizer,
String defaultFileName = null,
Int32 maxSaveAttempts = 3
)
{
this.resizer = resizer ?? throw new ArgumentNullException( nameof(resizer) );
this.saver = saver ?? throw new ArgumentNullException( nameof(saver) );
this.recognizer = recognizer?? throw new ArgumentNullException( nameof(recognizer) );
}
public DefaultImageProcessingService
(
IImageResizerService resizer,
IImageSavingService saver,
IImageObjectRecognizerService recognizer,
IMysteryService mystery,
String defaultFileName = null,
Int32 maxSaveAttempts = 3
)
{
this.resizer = resizer ?? throw new ArgumentNullException( nameof(resizer) );
this.saver = saver ?? throw new ArgumentNullException( nameof(saver) );
this.recognizer = recognizer ?? throw new ArgumentNullException( nameof(recognizer) );
this.mystery = mystery ?? throw new ArgumentNullException( nameof(mystery) );
}
}
这是可以接受的,因为其中一个构造函数只使用注册服务和默认值(第一个构造函数)。 DI 工厂不会使用第二个构造函数,因为它有一个不可满足的参数 (IMysteryService)。