如何对构造函数参数施加约束?
这是一个好习惯吗?
我有一个接口,我需要 Logger 组件(由统一注入)。
如何强制所有派生类都将 Logger 组件 (ILogger) 作为参数?
我找不到任何合适的解决方案。
我发现的唯一解决方法是将方法Initialize (<parameters>)
放在界面中。这是一种丑陋的方法,需要特殊处理。
有没有解决这些问题的设计模式?
如何对构造函数参数施加约束?
这是一个好习惯吗?
我有一个接口,我需要 Logger 组件(由统一注入)。
如何强制所有派生类都将 Logger 组件 (ILogger) 作为参数?
我找不到任何合适的解决方案。
我发现的唯一解决方法是将方法Initialize (<parameters>)
放在界面中。这是一种丑陋的方法,需要特殊处理。
有没有解决这些问题的设计模式?
您不需要约束来强制派生类具有记录器组件。只需定义基类构造函数来获取 ILogger。
public class Foo
{
public Foo (ILogger logger) { /* some implementation here */ }
}
public class Bar : Foo
{
public Bar(ILogger logger)
: base(logger)
{
// some implementation here
}
}
由于 Bar 派生自 Foo,因此它被迫使用带有记录器的构造函数。您还可以使 Foo 抽象,这将强制用户创建派生类的实例而不是 Foo 本身。
当您需要定义接口时,不要只考虑 C# 接口。抽象类非常适合这种情况。通常将抽象类视为接口(不是 C# 接口)。您所要求的不能用 C# 接口完成,因为它们定义了合同,而不是实现。
你为什么要强迫这样的事情?
关注什么是真正的合约(由接口定义),而不是像日志记录这样不重要的事情。合同应该以某种方式定义,即您不能在不失去执行核心功能的能力的情况下删除任何方法/属性。
例如,如果您有一个接口:
interface IAdder
{
double Add(double first, double second);
}
添加是核心功能。你可以有第三个参数 ILogger,但没有它你仍然可以添加。日志记录是实现细节,它不应该是合同的一部分。