Linq to Entities与WCF的结合

5

我将所有实体都放在我的edmx文件的一个单独项目中,然后使用WCF服务将它们暴露给客户端应用程序。

这意味着我不必直接向包含edmx文件的项目提供客户端应用程序的链接。这样做是不好的,因为它会包含查询数据库的对象。

但是,只有我的WCF服务使用的实体可以从客户端应用程序访问。例如,因为我在服务中有以下代码:

public MyClass GetMyClass()
{
     return new MyClass();
}

我可以通过以下方式在客户端应用程序中访问MyClass:

myServiceInstance.MyClass cls = new  myServiceInstance.MyClass()

如果我的edmx文件中有一个名为MyClass2的实体,我想在客户端应用程序中使用它!我该如何实例化它,而不需要直接向客户端提供我的edmx文件项目的链接或在服务层中创建一个无用的返回MyClass2的方法?
其他人是怎么做的呢?
非常感谢。

如果您希望以不同的、更加可辨认的格式显示代码片段,请编辑您的问题,选择代码文本,然后单击旁边带有01010的巨大引号图标。 - DOK
3个回答

3
我们创建了一个独立的项目,其中包含域传输对象类,作为我们各种内部WCF服务的数据合同。然后,我们与这些内部服务共享了合同项目。我们有一个数据服务;那些方法会在存储/检索之前/之后将这些域对象转换为/从实体对象中。同时,外部服务使用从XSD和WSDL文件生成的标准代理,并转换为/从共享的域传输模型。
不幸的是,我们必须这样做,因为对象上下文还不能在WCF上进行移植。
以下是您情况的一些注意事项:
1.如果您的客户端应用程序对于您的系统来说是外部的,则不应该知道您的EDMX或其类的任何信息。它只应该知道您的WSDL和XSD。
2.如果您的客户端应用程序是内部的,则尝试在EF v1中共享实体类没有什么用处,因为它还没有得到适当的支持。您需要传输更多的内容,而不仅仅是类/对象——您需要上下文,它维护更改跟踪,并且现在无法直接通过WCF完成。

2
如果WCF服务不使用它,那么你会想要它做什么呢?WCF服务本身纯粹用于数据传输 - 用于元数据的“mex”方法不共享代码,因此您的MyClass2将无效。如果您想要,在客户端可以使用程序集共享,但在这种情况下我真的不建议这样做;在客户端使用EF对象会很混乱...(而且它不适用于轻量级框架,如Silverlight、Client Profile和Compact Framework等)。
另一个选择是ADO.NET数据服务;这个服务可以通过WCF工作,但提供了比常规WCF方法更加LINQ友好的API - 您的模型公开的任何领域对象都应该在客户端数据上下文中可用。

1

如果您想以“正式”的方式完成它,您应该为通过网络传输的消息创建特殊的类,而不是尝试重用业务实体或数据对象作为消息。这样做的价值在于,您可以自由地更改业务实体和数据对象,而不必担心向消费者公开的合同发生变化。每个对服务的更改都是有点更加审慎的,因为它独立于数据和业务逻辑的更改。

处理此问题的另一种方法是简单地使用svcutil(或“添加服务引用…”,虽然svcutil适用于多个服务端点)生成客户端将使用的所有类,而不是添加对服务器项目的引用。这样,客户端将看到的唯一类是服务所公开的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接