接口依赖性

Chr*_*isz 4 c# oop

当您创建一个接口并且您知道您将依赖另一个接口时,您是否将构造函数作为接口的一部分?

就我而言,我想创造

我可以给客户端的IClientReceiveRecorder,并为短暂的测试会话收集所有网络流量.它可能只包含一组字符串.

一个IEvaluator,可以获取收到的所有消息并实现我们想要测试的各种内容.例如,我可能有一个具体的Evaluator来测试所有字符串是否包含字母'c'.

我知道任何IEvaluator都需要一个IClientReceiveRecorder来获取它要评估的消息.

所以,我看到了一些选择.我会做点什么吗?

interface IEvaluator
{
    IEvaluator(IClientReceiveRecorder);

    void Evaluate();
} 
Run Code Online (Sandbox Code Playgroud)

它不编译,所以我猜不是.

也许我会这样做

interface IEvaluator
{
    void Evaluate(IClientReceiveRecorder);
}
Run Code Online (Sandbox Code Playgroud)

或者,我是否只是将它留给具体类来在其构造函数中使用IClientReceiveRecorder?

Mat*_*and 5

直截了当的答案是将实现细节留给具体类.

知道实现IEvaluator将具有依赖性IClientReceiveRecorder是实现细节,并且不会包含在IEvaluator接口中.

如果您知道该接口将由另一个接口组成,您可以执行以下操作:

interface IEvaluator
{
    IClientReceiveRecorder { get; set; }

    void Evaluate();
}
Run Code Online (Sandbox Code Playgroud)

如何填充该属性是一个实现细节,不应该是接口的一部分.


Dav*_*vid 5

你真的不需要。

接口不一定是依赖关系的契约,而是功能的契约。任何实现都可以通过构造函数公开其依赖项。但是,如果不同的实现具有不同(或没有)依赖项,它仍然实现接口并公开功能。

您可以做的一件事是在界面中公开一个属性 getter,以显示依赖关系。这至少意味着实现类型需要公开具有预期类型的​​ getter,而这恰好是一个依赖项。

另一种完全可能的选择是使用抽象类而不是接口。(当然,要了解它们之间的差异。)该抽象类还可以使用构造函数来公开依赖关系,并且实现类型必须使用该构造函数。这种替代方案可能需要对整个代码进行其他更改,因此这取决于您。