如何在ServiceStack中使用DTO和POCO

How to use DTO and POCO in ServiceStack

我知道已经有几个关于这个的答案,但我只是不想一开始就走错了路。我的 POCO 具有在我的存储库中工作的继承和接口,我认为这是使用存储库模式的标准方法,对吧?因此,根据我的阅读,我应该将我的 POCO 复制到 DTO 中以便在我的服务中使用它们吗?真的吗?

当他们谈论使用 DTO 的开销时,他们是这么说的吗?

我意识到 "Simple Customer Database REST Services Example" 很好...很简单,但它仍然会发回 POCO。如果客户有很多属性并且您想要创建它,那么 CreateCustomer DTO 是否必须具有与客户 POCO 相同的属性?当您响应 GetCustomer 时,您不能 return POCO 如果它有 interface/inheritance.

也许我只是不明白...似乎工作量很大。

很难提供明确的答案,因为您并没有真正提出明确的问题或提供具体的例子来说明您的顾虑。

听起来你想做的很多事情都是令人沮丧的做法,我建议你调整你对什么是有效的看法,因为你想做的捷径可能会导致你遇到问题路.

如果您使用代码优先的 POCO ORM,例如 OrmLite,您可以重新使用 , but they should be maintained in the ServiceModel project (aka DTO .dll). You should maintain a separate DTO when your internal data model and external service contracts diverge, at which point you can use the built-in AutoMapping 以在它们之间轻松转换。

The Service Layer is your most important Contract

除了定义您的外部服务合同(您最重要的合同)之外,您不想将您的 Request DTO 重新用于任何事情。它本质上是一种理想情况下按 call semantics and Response Types 分组的操作,因为您的数据模型通常是与操作它们的操作无关的名词。

您应该考虑使用 POCO classes 将您的请求 DTO 定义为 DSL,其中其属性提供明确的参考来源,明确描述您的服务 accepts/returns。 POCO 是声明性的,将它们隐藏在继承背后会增加间接性、模糊关注点并降低清晰度,我不认为它可以节省工作。

Interfaces and Inheritance in DTO's is bad practice

虽然接口(或基础 class)属性允许代码中的松散耦合,但它们在序列化时会产生相反的效果,这需要专有的序列化扩展和与 .NET 命名空间的耦合,从而降低互操作性——核心之一服务的目标。它们也可能在未来导致运行时错误。