0

我有一个 ASP.NET MVC 4 项目,其中控制器调用 WCF 服务层,调用业务层,使用 EF 5.0 实体的存储库。然后将结果作为 POCO 实体返回给 Controller。

当 WCF 服务直接作为库引用时它工作正常,但我知道它不能作为服务引用,因为它们需要被序列化,并且启用 ProxyCreation 这是不可能的。

我不想创建 DTO,因为我使用生成的 POCO 实体,这就是我认为它们存在的原因。我只想在 POCO 实体到达服务层之前跟踪更改。

很多人都在谈论使用 DTO,即使它们与 POCO 相同,如果我这样做,我可以创建具有不同名称的自动生成的复制类作为“代理禁用 POCO 作为 DTO”,这会有点奇怪.

我可以杀死 POCO 的代理类,以某种方式从服务层返回时可以序列化对象吗?

另外我不知道这个想法是否是一个好习惯。但是将“干净”的实体发送到我的控制器会很棒,准备好映射到 ViewModel。我也在寻找性能。

4

2 回答 2

1

使用ProxyDataContractResolver解决了这个问题。我们也必须使用[Serializable] and [DataContract(IsReference=true)]。通过这种组合,可以启用 ProxyCreation。

于 2012-11-30T17:52:46.080 回答
0

我们处理这个问题的方法是执行以下操作:

  1. 自定义生成 POCO 类的 T4,以便生成用 [Serializable()] and [DataContract(IsReference=true)]属性修饰的类。
  2. 前端(视图)和后端(wcf 服务/业务层)都引用 POCO 生成的类,因为由于 IsReference=true,您不会使用代理。

基本上就是这样。

有了这个,您不必创建 DTO,只需在后端和前端使用 POCO 类。

但请记住,使用 IsReference=true 句柄的 WCF 不喜欢冗余对象(因此这将是某些具有导航属性的 POCO 类的问题)。

于 2012-11-29T05:24:08.607 回答