【发布时间】:2016-04-28 16:31:25
【问题描述】:
我正在学习 SOLID 原理,并且有一个关于与接口相关的依赖管理的问题。
我正在阅读的书中的一个示例(Gary McLean Hall 的Adaptive Code via C#)显示了一个 TradeProcessor 类,它将获取交易数据、对其进行处理并将其存储在数据库。交易数据由一个名为TradeRecord 的类建模。 TradeParser 类将处理将接收到的交易数据转换为 TradeRecord 实例。 TradeProcessor 类仅引用 ITradeParser 接口,因此它不依赖于 TradeParser 实现。
作者有Parse 方法(在ITradeParser 接口中)返回一个IEnumerable<TradeRecord> 集合,其中包含处理过的交易数据。这是否意味着ITradeParser 现在依赖于TradeRecord 类?
难道作者不应该做一个类似ITradeRecord 接口并让Parse 返回ITradeRecord 实例的集合吗?还是我错过了什么重要的东西?
代码如下(TradeRecord的实现无关所以省略):
TradeProcessor.cs
public class TradeProcessor
{
private readonly ITradeParser tradeParser;
public TradeProcessor(ITradeParser tradeParser)
{
this.tradeParser = tradeParser;
}
public void ProcessTrades()
{
IEnumerable<string> tradeData = "Simulated trade data..."
var trades = tradeParser.Parse(tradeData);
// Do something with the parsed data...
}
}
ITradeParser.cs
public interface ITradeParser
{
IEnumerable<TradeRecord> Parse(IEnumerable<string> tradeData);
}
【问题讨论】:
-
另请注意:作者主张将接口及其实现保存在单独的程序集中(即楼梯模式)。如果我遵循该模式,
TradeRecord将需要出现在两个程序集中,否则我必须从实现程序集引用到实现程序集(从而创建循环引用)。 -
其实 TradeRecord 的实现是相关的。如果那是纯数据类(只包含没有任何逻辑的属性),那么没有太多理由为它引入接口。
-
我认为这是因为 TradeRecord 只是一个简单的 DTO 对象。当然你可以为这个类创建一个接口,但是你会为你创建的每个其他类创建接口吗?您可以将 TradeRecord 类视为合同。
-
@Evk 作者没有提供实现,只引用了几个属性。
-
那么我认为我们可以放心地假设作者的意思是它是一个纯数据对象,因此不需要为它创建接口。至于您的第一条评论 - 在这种情况下,它应该存储在“接口”程序集中。
标签: c# dependency-management solid-principles