4

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

我想使用 WCF DataServices 向客户端公开数据,但我无法将数据对象从域模型发送到客户端。我将使用 DTO 与客户端交互,并且我有 dto<=> 数据对象映射。

DataServices 有反射提供者,在这种情况下似乎很好(让我们考虑只读场景)。但是反射提供者需要IQueryable<dto>暴露属性。这就是问题所在。所以我看到以下解决方法:

  1. 加载所有域对象,将它们全部映射到 dtos 并返回结果 dtos。如果存在许多域对象,则方法非常糟糕。
  2. 创建“linq2dto”提供程序并动态生成对应的“linq2EF”查询,在查询实现点从数据库获取数据对象并执行映射。听起来不错,但正如我所见,这是一项复杂的任务。

所以,伙计们,我需要帮助。我不想编写(和支持!)一个新的 linq 提供程序。可能有一些我可以使用的“通用 linq2anyware”实现?

另一方面,我真的不能向客户端公开数据对象并使用 DataServices EF 提供程序。有没有一些简单的方法来实现这种映射?

4

2 回答 2

1

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

可能不是您正在寻找的答案,但这是我的建议。如果不能暴露实际类型,请手动编写轻量级卫星类型,例如

class Foo
{
    //large domain type

    FooDTO ToDTO()
    {
        return new FooDTO(...)
    }
}

class FooDTO
{
    //lightweigh
}

我还没有看到任何可以帮助您制作通用转换器的 LINQ 提供程序,但这可能是因为我的经验有限。反对使用泛型转换器的另一个论点是域类型可能需要非常具体的指令,说明轻量级对象中包含什么以及排除什么。

或者,您可以尝试编写一个通用类,该类使用反射来遍历所有公共属性并返回一个序列化对象,但是您如何知道线路另一端的对象类型(如果您不能使用您的域类型)?

于 2012-08-10T13:12:10.540 回答
1

不幸的是,如果您真的打算使用 DTO,您将需要承担将查询树转换为 EF 可以使用的工作的工作。这很可能使您进入自定义提供程序领域,这是您必须处理的另一个问题。

对于查询树翻译,您可能会查看类似re-linqIQ toolkit的内容。

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

于 2012-08-10T16:29:22.377 回答