DataContracts与行为

时间:2009-07-13 17:50:52

标签: wcf datacontract

有多糟糕?我已经阅读了无数文章,从未创建过具有行为的抽象DataContracts,但似乎这样做将解决我遇到的问题,这将阻止我在各处创建工厂以确定子类实现。我的问题是,如果我决定在数据合同中添加行为,我会受到惩罚吗?当然,在调用存储库调用并保持数据之前,它们不能被消耗并且在那里执行特定于该子类类型的某些操作。我可以为每个子类创建“Manager”类,但这会让我回到工厂,我正在尝试更多的多态方法。提前谢谢。

4 个答案:

答案 0 :(得分:13)

您可以将所需的所有行为添加到数据合同中。您应该清楚地记录这样的事实,即客户看不到该行为,或者稍后会有人失望。还记录了必须注意不要将任何依赖于实现的数据添加到数据协定中的事实,因为它不是您想要传递给客户端的任何内容。

总而言之,我认为最好让数据合同成为数据合同,并将行为排除在外。

答案 1 :(得分:8)

为什么不能以经典方式创建数据协定(MyDataContract),只是数据字段,没有其他内容,然后从中派生您的行为类?

public class BehaviorialClass : MyDataContract
{
.....
}

通过这种方式,您可以清楚地分清问题,您的数据合同不会被无法解决的行为“污染”......

马克

答案 2 :(得分:6)

将行为直接放在DataContracts中的一个好方法是将行为定义为extension methods与合同相同的程序集或完全不同的程序集。可选地,扩展方法可以放置在与合同不同的命名空间中,以进一步隔离数据和行为的分离。

这样,您的合同保持清洁,但与此同时,您的合同的.NET消费者可以轻松地导入与这些DataContracts相关的其他功能。

答案 3 :(得分:0)

在某些时候,您将要使用MemberwiseClone并实现接口而无需中间数据转换(更糟糕的是,不必要的维护)。扩展方法适用于当你无法控制对象定义但仍然需要面向对象的流畅性时;他们在任何其他情况下都会添加繁忙的工作,并且分散比C / C ++更差的类定义。降低"趋势"你可以发现一个改变整个球赛的模式(比如Jeffrey Richter的AsyncEnumerator)。