WCF DataServices&映射的DTO

时间:2012-08-10 12:45:22

标签: c# wcf-data-services dto

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

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

DataServices有反射提供程序,在这种情况下似乎没问题(让我们考虑只读方案)。但反射提供者需要公开IQueryable<dto>属性。这就是问题所在。所以我看到了以下解决方法:

  1. 加载所有域对象,将所有域对象映射到dtos并返回结果dtos。如果存在许多域对象,那真的很糟糕。
  2. 创建“linq2dto”提供程序并生成动态对应的“linq2EF”查询,在查询实现时从db获取数据对象并执行映射。它听起来不错,但正如我所见,这是一项复杂的任务。
  3. 所以伙计们,我需要帮助。我不想写(并支持!)新的一个linq提供者。可能有某些“一般的linq2anyware”实现我可以使用吗?

    另一方面,我实际上无法将数据对象暴露给客户端并使用DataServices EF提供程序。有没有一些简单的方法来实现这种映射?

2 个答案:

答案 0 :(得分:1)

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

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

class Foo
{
    //large domain type

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

class FooDTO
{
    //lightweigh
}

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

或者,您可以尝试编写一个使用反射来遍历所有公共属性并返回一个serrialised对象的泛型类,但是如何知道一个线的另一端的对象类型(如果你无法使用您的域名类型)?

答案 1 :(得分:1)

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

具体来说,对于查询树翻译,您可能会看到re-linqIQ toolkit之类的内容。

我们是否可以就有关您需要DTO的原因的评论进行简短的对话?如果他们能够理解这个细节,我认为这个问题对其他人更有用。