Wcf 数据契约与行为

Wcf 数据契约与行为,wcf,datacontract,Wcf,Datacontract,有多糟?我读过无数的文章,以前从未使用行为创建过抽象的数据契约,但这样做似乎可以解决我遇到的一个问题,这将阻止我在任何地方创建工厂来确定子类实现。我的问题是,如果我决定将行为添加到数据契约中,我会受到惩罚吗?当然,它们不能被使用,在调用存储库调用和数据持久化之前,它们可以执行特定于该子类类型的特定操作。我可以为每个子类创建“Manager”类,但这让我回到了工厂,我正在尝试一种更多态的方法。提前感谢。为什么不能用经典方式创建数据契约(MyDataContract),只创建数据字段,而不创建其他内

有多糟?我读过无数的文章,以前从未使用行为创建过抽象的数据契约,但这样做似乎可以解决我遇到的一个问题,这将阻止我在任何地方创建工厂来确定子类实现。我的问题是,如果我决定将行为添加到数据契约中,我会受到惩罚吗?当然,它们不能被使用,在调用存储库调用和数据持久化之前,它们可以执行特定于该子类类型的特定操作。我可以为每个子类创建“Manager”类,但这让我回到了工厂,我正在尝试一种更多态的方法。提前感谢。

为什么不能用经典方式创建数据契约(MyDataContract),只创建数据字段,而不创建其他内容,然后从中派生行为类

public class BehaviorialClass : MyDataContract
{
.....
}
这样,您就有了一个良好的、干净的关注点分离,您的数据契约不会被它实际上无法处理的行为“污染”


Marc

将行为直接放在DataContracts中的一个很好的折衷办法是将行为定义为与契约在同一程序集中,或者完全不同的程序集中。或者,可以将扩展方法放置在与契约分离的命名空间中,以进一步隔离数据和行为的分离


通过这种方式,您的合同保持干净,但同时,.NET合同使用者可以轻松地导入与这些数据合同相关的附加功能。

您可以将所有需要的行为添加到数据合同中。你应该清楚地记录这样一个事实,即客户看不到这种行为,否则以后会有人失望。还要记录一个事实,即必须注意不要将任何依赖于实现的数据添加到数据契约中,因为这不是您想要传递给客户机的任何内容


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

在某种程度上,您可能希望使用MemberwiseClone并实现接口,而无需不必要的中间数据转换(甚至更糟糕的是,无需维护)。扩展方法适用于当您实际上无法控制对象定义,但仍然需要面向对象的流畅性时;它们在任何其他情况下都会增加繁忙的工作,分散类定义,比C/C++更糟糕。逆“趋势”而动,做适合你的事情,你可能会发现一种模式改变了整个游戏(就像杰弗里·里希特的异步枚举器)。

“我认为你最好让数据契约成为数据契约,而不去考虑它们的行为。”阿门!