当我不想*稍后*跟踪实体时,如何通过 WCF 服务发送 POCO 实体?



我有一个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。

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

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

基本上就是这样。

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

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

最新更新