我有一个ASP.NET MVC 4项目,其中Controller调用WCF服务层,该服务层调用业务层,使用EF 5.0实体的存储库。然后将结果作为POCO实体返回给控制器。
当WCF服务直接作为库引用时,它可以正常工作,但我知道它不能作为服务引用,因为它们需要序列化,而启用了ProxyCreation,这是不可能的。
我不想创建DTO,因为我使用生成的POCO实体,这就是我认为它们存在的原因。我只想在POCO实体到达服务层之前跟踪更改。
很多人都在谈论使用DTO,即使它们与POCO相同,如果我这样做,我可以创建具有不同名称的自动生成的复制类,作为"代理禁用的POCO作为DTO",这会有点奇怪。
我可以杀死POCO的代理类吗?在某种程度上,当从服务层返回对象时,可以序列化该对象吗?
我也不知道这个想法是否是一个好的实践。但如果能将"干净"的实体发送到我的控制器,并准备映射到ViewModels,那就太好了。我也在寻找表演。
使用ProxyDataContractResolver解决了问题。我们也必须使用[Serializable] and [DataContract(IsReference=true)]
。使用此组合,可以启用ProxyCreation。
我们处理此问题的方法是执行以下操作:
- 自定义生成POCO类的T4,以便生成用
[Serializable()] and [DataContract(IsReference=true)]
属性 - 前端(视图)和后端(wcf服务/业务层)都引用POCO生成的类,因为由于IsReference=true,您不会使用代理
基本上就是这样。
这样,您就不必创建DTO,只需在后端和前端使用POCO类。
不过,请记住,使用IsReference=true句柄的WCF不喜欢冗余对象(因此,对于一些具有导航属性的POCO类来说,这将是一个问题)。