2012-03-14 77 views
0

我有一种情况,我有一个传统服务已经工作。该服务具有传统业务对象。产品团队决定通过WCF技术公开该服务。通过网络发送DTO的方法是什么?从传统服务WCF:设计方法

,我能想到的解决方案:。

1)转换整个业务对象DataContracts(污染的我的遗留系统与WCF特定的命名空间)

2)编写新的DTO(DataContracts),其会包装现有的业务对象。 (这意味着我写了某种包装,这可能会导致性能问题。)

3)您可以建议的任何其他方法。

我在正确的方向思考?有没有比上述两种更好的方法?

问候,

+0

我不知道你的意思:

最后,我当我开始接触WCF,这是一个很大的帮助发现了什么?如果你只是从旧服务中返回类型呢? – 2012-03-14 12:03:59

回答

2

所以,如果我正确地理解了你,你已经有一套业务对象在你的应用程序内部使用,现在你想使用WCF创建一个公开这些对象的服务。

我想答案是它取决于。通常,如果您的业务对象是成熟的并且极不可能改变,那么您可以通过您的WCF服务公开这些对象。正如monnb所说,WCF将会与这些工作共同工作,而不必为其添加属性。但是,如果您可能随时间改变业务对象,那么您将处于一个痛苦的世界......例如,让我们说你发布了一个服务版本,然后人们开始使用它,每个人都开心。但是,您需要对现有业务实体进行一些更改。当你这样做,你更新你的WCF服务使用新的对象,这意味着你已经违反你的合同。你公开的DTO背后的想法是,它们被认为是你的服务和消费者之间的契约 - 而改变这往往是一件坏事。

我建议你去一个干净的方法,并为WCF服务创建新的DTO对象。然后,您可以在WCF“图层”中独占使用这些内容。然后在需要时使用AutoMapper来映射这些对象和传统对象。 http://www.netfxharmonics.com/2008/11/Understanding-WCF-Services-in-Silverlight-2

+0

+1为合约的突破点。如果这是一个面向外部的界面,那么肯定需要一套新的DTO。 – StuartLC 2012-03-14 13:09:15

+0

谢谢!我相信我现在有一些意见! – James 2012-03-15 06:56:26

1

一些点,这可能会帮助你对你的

  1. 如果你没有在任何[DataContract]/[DataMember]/[EnumMember]属性的(现有)实体的补充决定DataContractSerializer will still serialize DTO的是,你会期望,即公共财产。
  2. 如果您需要在如何您实体“看”在WSDL并将所得的消息,特别是与命名空间和包装器1更多的控制权:N的关系,你也应该考虑寻找MessageContract而不是DataContract
  3. 如果你把财产名称相似,像AutoMapper这样的工具使得内部实体到外部传输对象的映射非常简单,尽管性能很小。