0

如何对构造函数参数施加约束?
这是一个好习惯吗?

我有一个接口,我需要 Logger 组件(由统一注入)。
如何强制所有派生类都将 Logger 组件 (ILogger) 作为参数?

我找不到任何合适的解决方案。

我发现的唯一解决方法是将方法Initialize (<parameters>)放在界面中。这是一种丑陋的方法,需要特殊处理。

有没有解决这些问题的设计模式?

4

2 回答 2

3

您不需要约束来强制派生类具有记录器组件。只需定义基类构造函数来获取 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# 接口完成,因为它们定义了合同,而不是实现。

于 2012-11-24T04:38:45.537 回答
0

你为什么要强迫这样的事情?

关注什么是真正的合约(由接口定义),而不是像日志记录这样不重要的事情。合同应该以某种方式定义,即您不能在不失去执行核心功能的能力的情况下删除任何方法/属性。

例如,如果您有一个接口:

interface IAdder
{
    double Add(double first, double second);
}

添加是核心功能。你可以有第三个参数 ILogger,但没有它你仍然可以添加。日志记录是实现细节,它不应该是合同的一部分。

于 2012-11-25T22:21:26.150 回答