WCF数据合同,共享类和DTO的最佳实践

时间:2012-07-26 20:26:20

标签: wcf domain-driven-design dto datacontract

在我破坏应用程序之前,我当前的命名空间看起来像这样:

CompanyAbc.Core
CompanyAbc.AppXyz.Web
CompanyAbc.AppXyz.Business

CompanyAbc.Core命名空间包含我们公司所有应用程序使用的公共代码。一个例子是一个名为“ClientMessage”的类,我们将其用作容器,将消息从一个层传送到另一个层(例如,抽象出来并支持在数据层一直保存数据时显示成功或错误消息。 UI层)

我们现在将CompanyAbc.AppXyz.Business转换为WCF服务。我的问题是:“共享”(或不共享)这些基础/公共实体的最佳做法是什么?

例如,你会:

a)将[DataContract]属性直接添加到CompanyAbc.Core命名空间中的类,即使它与WCF无关。

   CompanyAbc.Core.Entities
            ClientMessage.cs

OR

b)创建一个数据传输对象,它是CompanyAbc.Core命名空间的精确副本?

   CompanyAbc.Core.Entities
            ClientMessage.cs
   CompanyAbc.AppXyz.Business.DataContracts
            ClientMessageDto.cs

OR

c)其他选择?

另一个复杂性是我们打算共享这些程序集。但是为了强制脱钩而不是分享集会/商业实体,你会疯狂地做出类似的事情吗?

   CompanyAbc.Core
   CompanyAbc.Core.Shared.Entities
      ClientMessage.cs

   CompanyAbc.AppXyz.Web
   CompanyAbc.AppXyz.Web.Entities
      ClientMessage.cs --> derives from the Core.Shared, or just duplicate code?

   CompanyAbc.AppXyz.Business.Entities
      ClientMessage.cs --> derives from the Core.Shared, or just duplicate code?
   CompanyAbc.AppXyz.Business.DataContracts
      ClientMessageDto.cs

2 个答案:

答案 0 :(得分:1)

我建议你制作"等级组"在您的程序集中,为了使其更简洁,其使用更直观。例如: (以@learner为例作为基础)

ABC.Common (It communicates better the intention)
ABC.Core
ABC.Core.Web
ABC.Core.Windows
ABC.Services.DataContracts
ABC.Services.ServicesContracts

等等......

制定清晰的层次结构会激发开发人员的使用,因为它适合已部署的先前程序集。 查看.NET程序集以获取参考。

答案 1 :(得分:0)

以下是我的命名空间的样子,就像我到目前为止所使用的那样:

ABC.Core
ABC.Data
ABC.Business
ABC.Web;
ABC.Services (common)
ABC.Services.DTO (common)
    ABC.Services.Svc1
        ABC.Services.Svc1.DTO
    ABC.Services.Svc2
        ABC.Services.Svc2.DTO

在实践中,您不希望服务之间有这么多共享类,因为它们可能希望彼此分开。更好的是独立的一个,你可以更好地对它们进行版本化,但是确实需要在每个服务的DTO级别中需要一些重复的代码。许多人使用Automapper将Core类投影到DTO中。

让我知道你的想法。