EF + POCO + WCF + WPF.在客户端重用POCO类或使用dto

本文关键字:POCO dto 客户端 WCF WPF EF | 更新日期: 2023-09-27 18:12:34

我们正在开发一个带有WPF客户端的三层应用程序,该客户端通过WCF与BLL通信。我们使用EF访问我们的数据库。我们一直在使用EF的默认EntityObject代码生成器,但是在通过网络发送这些对象时,以及在BLL中处理和重新连接它们时,有很多问题和序列化问题。

我们即将切换到POCO模板,并重写我们应用程序的数据访问和通信部分(我们希望有一个更清晰的架构和更少的"魔法代码"。

我的问题是在客户端重用POCO类是否是个好主意?或者我们应该创建单独的DTO类?即使它们与POCO实体类相同?这两种方法的优缺点是什么?

EF + POCO + WCF + WPF.在客户端重用POCO类或使用dto

一定要使用DTOs + AutoMapper。否则,在使用WCF时,由于循环依赖(特别是导航属性的问题),您将在DataContractSerializer中遇到大量问题。尽管您最初可能会忽略dto,但由于上面提到的问题,您将在以后被迫使用它们。因此,我建议为每一层使用适当的dto。

而且你的层特定模型将携带不同的属性。您可能还需要修改(即专门化)在每个层中携带的数据。因此,如果您的项目足够大(或有这样的前景),请使用具有适当命名的dto并将它们放置在适当的位置(即不是所有dto都在同一个程序集中)。

现在我在处理类似的问题。我已经做了下一步:

  1. 创建下一个组件:

科幻。契约——它只定义了servicecocontracts和dataconts。显然,所有的数据合约都可以像EF中的POCO类一样使用(但我不使用t4或其他生成器-所有的POCO类和DataContext都是手动编写的,因为我需要使用非常糟糕的数据库)。科幻小说。

科幻。DataAccessObjects -在这个程序集中,我实现了我的edmx和DataContext。科幻小说。服务——WCF服务的实现。

所以,大量的select WCF方法都有下一个签名和实现:

        public List<Vulner> VulnerSelect(int[] idList = null, string[] navigationPropertiesList = null)
    {
        var query = from vulner in _businessModel.DataModel.VulnerSet
                    select vulner;
        if (navigationPropertiesList != null)
            navigationPropertiesList.Select(p =>{query = ((ObjectQuery<Vulner>)query).Include(p);
                                   return true; });
        if (idList != null)
            query = query.Where(p => idList.Contains(p.Id));
        return query.ToList();
    }

,你可以这样使用这个方法:

WCFproxy.VulnerSelect(new[]{1,2,3},new[]{"SecurityObjects", "SecurityObjrcts.Problem"});

,这样,你就没有序列化,导航属性等问题,你可以清楚地指出哪些导航属性必须加载。

注。

我建议使用dto。

循环依赖关系和大型对象图可能是严重的问题,导致错误或过多的序列化流量。在ORM控制的对象上有太多的噪声,无法将其发送到线路上。

我使用服务层来访问我的域对象并广泛使用LINQ,但我总是将DTO对象返回给客户端。