我有域模型的服务,我希望向客户端公开数据。服务具有典型的体系结构:数据库,ORM(EF),具有域模型的业务层。
我想使用WCF DataServices向客户端公开数据,但我无法将数据对象从域模型发送到客户端。我将使用DTO与客户端进行交互,并且我有dto< =>数据对象映射。
DataServices有反射提供程序,在这种情况下似乎没问题(让我们考虑只读方案)。但反射提供者需要公开IQueryable<dto>
属性。这就是问题所在。所以我看到了以下解决方法:
所以伙计们,我需要帮助。我不想写(并支持!)新的一个linq提供者。可能有某些“一般的linq2anyware”实现我可以使用吗?
另一方面,我实际上无法将数据对象暴露给客户端并使用DataServices EF提供程序。有没有一些简单的方法来实现这种映射?
答案 0 :(得分:1)
简而言之,手动编写每个DTO。
可能不是您正在寻找的答案,但这是我的建议。如果您无法公开实际类型,请手动编写轻量级卫星类型,例如
class Foo
{
//large domain type
FooDTO ToDTO()
{
return new FooDTO(...)
}
}
class FooDTO
{
//lightweigh
}
我还没有看到任何可以帮助你制作通用转换器的LINQ提供商,但也许是因为我的经验有限。反对使用通用转换器的另一个论点是,域类型可能需要非常具体的指令,说明要包含在轻量级对象中的内容以及要排除的内容。
或者,您可以尝试编写一个使用反射来遍历所有公共属性并返回一个serrialised对象的泛型类,但是如何知道一个线的另一端的对象类型(如果你无法使用您的域名类型)?
答案 1 :(得分:1)
不幸的是,如果你真的开始使用DTO,你将需要承担执行EF可以使用的查询树转换的工作。这很可能会让您进入自定义提供商区域,这是您必须处理的另一个问题。
具体来说,对于查询树翻译,您可能会看到re-linq或IQ toolkit之类的内容。
我们是否可以就有关您需要DTO的原因的评论进行简短的对话?如果他们能够理解这个细节,我认为这个问题对其他人更有用。