【发布时间】:2017-05-09 09:55:33
【问题描述】:
我和我的团队正在讨论是否使用 DTO 模型作为接口契约的方法参数。请记住,我们正在使用一个接口,因此我们可以使用依赖反转并将其模拟为单元测试的依赖。
public interface IContract {
object Method1(DTOModel model);
}
public class Implementation1 {
public object Method1(DTOModel model) {
//do stuff with Property1 and Property2
}
}
public class Implementation2 {
public object Method1(DTOModel model) {
//do stuff with Property3 and Property4
}
}
public class DTOModel {
public string Property1 {get;set;}
public string Property2 {get;set;}
public string Property3 {get;set;}
public string Property4 {get;set;}
}
场景是这样的:我们试图在我们的实现中保持灵活性,以便我们可以同时使用它们。我不同意这种方法,除非两种实现都需要合同中的相同信息。在我看来,这将是一个单独的合同/实施,或者当前合同必须更改,并且只能同时使用一个实施。
我的想法是,如果您以这种方式使用 DTO,那么您将通过允许两个不同的实现根据设置的属性表现出不同的行为来违反合同。这也意味着消费者必须知道正在使用哪个实现才能知道完成操作所需的属性。最后,这意味着两个实现都可以访问彼此不需要的属性。
我解决此问题的方法是将DTOModel 的属性传递给实现,并使Implementation2 遵守该合同:
public object Method1(string property1, string property2) {
//do stuff with property1 and property2
}
问题是:如果知道您的实现不依赖于整个合同和/或依赖合同的不同部分来做不同的事情,是否可以像上面那样传递 DTO?或者合同是否应该明确说明实现需要做什么?
提前致谢。
更新: 澄清一下,这两种实现都有相同的目的,但在不同的提供者上运行。例如,我们可能使用 2 个会员提供者,一个提供者需要 2 个特定属性,而另一个需要 2 个不同的属性。它们的目的是相同的,因为它们都将验证用户,但是每个实现的方式不同。
【问题讨论】:
-
如果方法不需要需要整个 DTO 对象,那么它不应该需要整个 DTO 对象。您总是希望尽可能避免紧耦合。仅仅因为该方法恰好具有该方法所需的信息而要求该方法使用一个不相关的 DTO 对象似乎是错误的。
标签: c# .net interface architecture