C# WCF数据服务和;映射DTO

C# WCF数据服务和;映射DTO,c#,wcf-data-services,dto,C#,Wcf Data Services,Dto,我有一个具有域模型的服务,我想向客户端公开数据。服务具有典型的体系结构:数据库、ORM(EF)、带有域模型的业务层 我想使用WCF数据服务向客户机公开数据,但我不能将数据对象从域模型发送到客户机。我将使用DTO与客户机交互,并且我有dtodata对象映射 Data Services有反射提供者,在这种情况下似乎很好(让我们考虑只读场景)。但是反射提供程序需要公开IQueryable属性。这就是问题所在。因此,我看到了以下解决方法: 加载所有域对象,将它们映射到DTO并返回结果DTO。如果存在多

我有一个具有域模型的服务,我想向客户端公开数据。服务具有典型的体系结构:数据库、ORM(EF)、带有域模型的业务层

我想使用WCF数据服务向客户机公开数据,但我不能将数据对象从域模型发送到客户机。我将使用DTO与客户机交互,并且我有dtodata对象映射

Data Services有反射提供者,在这种情况下似乎很好(让我们考虑只读场景)。但是反射提供程序需要公开

IQueryable
属性。这就是问题所在。因此,我看到了以下解决方法:

  • 加载所有域对象,将它们映射到DTO并返回结果DTO。如果存在多个域对象,则这种方法非常糟糕
  • 创建一个“linq2dto”提供程序并动态生成对应的“linq2EF”查询,在查询具体化时从数据库获取数据对象并执行映射。听起来不错,但正如我所见,这是一项复杂的任务
  • 伙计们,我需要帮助。我不想编写(并支持!)一个新的linq提供程序。可能有一些“通用linq2anyware”的实现我可以使用


    另一方面,我真的不能向客户机公开数据对象并使用DataServices EF provider。是否有一些简单的方法来实现这种映射?

    简而言之,手动编写每个DTO

    也许不是你想要的答案,但这就是我的建议。例如,如果无法公开实际类型,请手动编写轻量级附属类型

    class Foo
    {
        //large domain type
    
        FooDTO ToDTO()
        {
            return new FooDTO(...)
        }
    }
    
    class FooDTO
    {
        //lightweigh
    }
    
    我还没有看到任何LINQ提供商可以帮助您制作通用转换器,但可能是因为我的经验有限。反对使用泛型转换器的另一个论点是,域类型可能需要非常具体的指令,说明轻量级对象中包含什么以及排除什么


    或者,您可以尝试编写一个泛型类,该类使用反射遍历所有公共属性并返回一个serrialised对象,但是如果您不能使用域类型,您如何知道另一端的对象类型呢?

    不幸的是,如果您真的开始使用DTO,您需要承担将查询树转换为EF可以使用的内容的工作。这很可能会让您进入定制提供商领域,这是您必须处理的另一个问题

    具体来说,对于查询树转换,您可能会看到类似于或的内容


    我们可以在关于为什么需要DTO的问题的评论中进行简短的对话吗?我认为,如果其他人也能理解这些细节,这个问题对他们会更有用。

    先问一个明显的问题:你真的需要DTO吗?使用EF先编码并不能充分满足您的需求?我认为使用DTO的原因如下:1。不同的服务器和客户端代码。它将简化代码重构,因此我可以更改服务器数据对象、正确映射并更改客户端对象2。从客户端3隐藏服务器端代码(将数据对象映射到db表)。再增加一个分机点,这样就有机会拦截客户电话,并以特定的方式进行处理。我不确定这是否完全符合您的观点,但我会回答如下:1。客户机代码实际上与服务器代码不同-您可以将自己的POCO带到WCF数据服务,或者如果您使用“添加服务引用”,我们将为您生成代理类。如果在客户端使用自己的POCO,则单独重构服务器和客户端可能会更容易。2.EF代码首先在处理对象RDBMS“阻抗失配”方面已经做得相当好;如果你还没有玩的话,你应该玩这个。3.你看过QueryInterceptors/ChangeInterceptors了吗?@Sergey:关于你提供的三个原因,你选择了哪条路径?我现在的处境也一样。您是否按照Mark的建议在客户端和服务器端同时使用POCO?如果是,您是否遇到任何安全问题?