5

我的 edmx 文件中有一个单独的项目中的所有实体,我使用 WCF 服务将它们公开给我的客户端应用程序。

这意味着我不必为我的客户端应用程序提供指向包含 edmx 文件的项目的直接链接。那会很糟糕,因为它会延续对象来查询数据库。

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

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

..我可以在我的客户端应用程序中使用访问 MyClass ,例如:

myServiceInstance.MyClass cls = new  myServiceInstance.MyClass()

如果我的 edmx 文件中有一个名为 MyClass2 的实体,我想在我的客户端应用程序中使用它,那该怎么办!如何在不给我的客户直接链接到我的 edmx 文件项目或在我的服务层中创建一个返回 MyClass2 的无用方法的情况下实例化它

其他人在做什么?

非常感谢

4

3 回答 3

3

我们使用域传输对象类创建了一个单独的项目,作为我们各种内部WCF 服务的数据契约。然后,我们与这些内部服务共享合同项目。我们有一项数据服务;这些方法将在存储/检索之前/之后将这些域对象转换为实体对象/从实体对象转换。同时,外部服务使用从 XSD 和 WSDL 文件生成的标准代理,并与共享域传输模型进行转换。

不幸的是,我们不得不这样做,因为对象上下文(还)不能通过 WCF 移植。

针对您的情况的一些注意事项:

  1. 如果您的客户端应用程序在您的系统外部,它不应该知道任何关于您的 EDMX 或其类的信息。它应该只知道您的 WSDL 和 XSD。
  2. 如果您的客户端应用程序是internal,那么尝试在 EF v1 中共享实体类是没有用的,因为它还没有得到适当的支持。您需要传输的不仅仅是类/对象 - 您还需要上下文,它维护更改跟踪,现在不能直接通过 WCF 完成。
于 2008-10-21T07:49:15.240 回答
2

如果 WCF 服务不使用它,你想要它做什么?WCF 服务(本身)纯粹用于数据传输 - 元数据的“mex”方法不共享代码,因此您的 MyClass2 将无能为力。如果你愿意,你可以在客户端使用程序集共享,但在这种情况下我真的不推荐这样做;客户端的 EF 对象是一团糟……(此外,它不适用于 Silverlight、Client Profile、Compact Framework 等轻量级框架)

另一种选择是ADO.NET 数据服务;这适用于 WCF,但为您提供比常规 WCF 方法更适合 LINQ 的 API - 并且您的模型公开的任何域对象都应该在客户端数据上下文中可用。

于 2008-10-21T06:46:16.397 回答
1

如果您想以“正确”的方式进行操作,您应该为通过网络传输的消息创建特殊类,而不是尝试将业务实体或数据对象作为消息重用。这样做的价值在于,您可以自由地更改您的业务实体和数据对象,而不必担心您向消费者公开的合同会发生变化。对服务的每一次更改都需要经过深思熟虑,因为它独立于数据和业务逻辑的更改而发生。

处理此问题的另一种方法是简单地使用 svcutil(或“添加服务引用...”,尽管 svcutil 对多个服务端点工作得更好)来生成客户端将使用的所有类,而不是添加对服务器项目的引用。这样,您的客户将看到的唯一类是服务公开的类。

于 2008-10-21T12:46:25.733 回答