【问题标题】:DataContract definition on generic classes泛型类上的 DataContract 定义
【发布时间】:2012-01-16 16:04:54
【问题描述】:

我们有一个分层的应用程序:

UI WCF DAL(使用实体框架)

我们不想公开我们的 EntityTypes,因此我们正在转换为 DAL 中的自定义 DTO。 DTO 类型被 UI、WCF 和 DAL 解决方案引用。

提出了几个问题 -

  • 将 [DataContract] 和 [DataMember] 属性添加到我们所有的自定义 DTO 类型和属性是否有任何负面影响?
  • 这会导致不想通过 WCF 访问数据的应用程序出现任何问题吗?

【问题讨论】:

  • 为什么在 UI 和 DAL 之间使用 WCF?
  • 我们要处理一堆业务逻辑。完整的层堆栈将是:UI -> WCF -> BL -> DAL -> DB。
  • 所以我的问题是为什么要引入 WCF 层。 UI 是否托管在业务层之外?
  • 是的,它们可以安装在不同的位置,它们也被多个应用程序使用。

标签: wcf entity-framework dto


【解决方案1】:

No 和 No。这些属性是 WCF 用于创建和执行您的 Web 服务合同并确定哪些内容通过网络进行序列化的机制的一部分。

【讨论】:

  • 从技术上讲,这些属性由 WCF 使用的 DataContractSerializer 使用。但是,您不需要使用 WCF 来使用序列化。
  • 如果您从 WCF 服务公开 wsdl,则 datacontract 和 datamember 属性将影响输出的架构。因此,这些属性的输出也与非 wcf 消费者相关 - 如果他们依赖 wsdl 来生成代理。
【解决方案2】:

属性被插入到元数据中并驻留在那里,直到一些用户代码使用反射来查询它们。它们对性能没有任何影响,唯一的问题是它们扩大了程序集元数据表。 但这更多是设计问题,您通常不应该陷入这种情况。如果您使用与平台无关的属性来装饰某个类,例如[Serializable],那么您会说“好吧,这种类型可能有一天会被序列化,无论您想以何种方式以及在何处使用它”。这非常好,但是如果你用一个特定于平台的属性来装饰同一个类,比如[DataContract],那么你有点告诉全世界“好的,这是一个 WCF DTO,旨在用于操作合同”。另外,您将类与 DataContractSerializer 耦合,甚至更多,如果您使用 DataContract,那么您还必须明确定义 [DataMember]s。

结论 - 你通常不应该走这条路。考虑重构您的软件模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多