【问题标题】:WCF another best practice?WCF 另一个最佳实践?
【发布时间】:2012-03-23 03:50:11
【问题描述】:

好的,所以我已经构建了我的 WCF 服务并且它的功能非常好!但是,我现在开始将它实现到我们预先存在的软件中,我立即遇到一个问题,我是否只使用代理生成的代码并摆脱我最初使用的 dll?还是我保留两者,并在两者之间做出非常明显的区分?

我所说的保持区别的意思是,拥有一个代表同一个用户对象的 ServerUser 和一个 LocalUser 属性。但是,如果应用程序服务不可用,我的 LocalUser 属性将通过应用程序最初运行的 dll 填充。

我对这种思维模式的主要原因是,如果我删除我的 dll,我就会遇到单点故障。如果由于某种原因我的 ServiceHost 没有启动并运行,但数据库服务器是,我希望我的用户仍然能够完成他们的工作。新的 WCF 实现使用的功能不依赖于员工完成他们的工作。 WCF 服务提供的更多便利。此外,在服务中构建这种逻辑将允许在非 IIS 托管环境中更容易地进行服务修改。

另外,有没有办法在服务上构建逻辑,以便当我为客户端拉下代理代码时,它只知道在 ServiceHost 不可用时手动访问数据库?如果这是可能的,我想我所有问题中的 90% 都会消失。

提前谢谢你!

【问题讨论】:

  • 我认为我需要更多信息才能做出好的回答,但我认为拥有两条路径(直接到数据库和通过服务)并不是一个好主意——只使用服务和隐藏数据库层
  • 您始终可以提供您创建的手动代理,它可以做任何您想做的事情。

标签: c# wcf service failover


【解决方案1】:

从您的描述看来,保留现有的 DLL(即直接访问数据库)最适合您的需求。如果 WCF 服务失败了,那么无论如何您都只会使用 DLL,那么拥有 WCF 服务不会增加任何东西。

理想情况下,您会完全使用 WCF 服务,并提供某种冗余来处理任何潜在的服务问题。此外,使用服务意味着您不必处理任何 DLL 升级/部署。

但是,从您的问题来看,如果服务不可用,听起来会有一些真正的问题需要处理,所以只需使用 DLL。

编辑:只需阅读问题的最后一部分,我认为这是不可能的。访问服务的代理代码是在您添加对项目的引用时生成的。您所追求的那种“动态”信息实际上需要服务。

编辑:作为我下面评论的后续行动,您可以通过创建 DLL 和类来测试它,我们称之为 Class1。然后使用将返回 Class1 的方法创建 WCF 服务。创建客户端应用程序并添加对服务的引用。如果您查看代理生成的代码,您应该会看到(希望......我在输入时正在考虑这个:))该方法返回 Class1,但是当您编译它时将无法找到 Class1。这是因为 Class1 没有在客户端上自动生成 Class1 的 DataContractAttribute。因此,您必须将共享的 DLL 分发给客户端。现在,当方法返回并且 WCF 尝试重新创建 Class1 时,它将使用共享 DLL 中的本地版本。您的其他 DLL(已在客户端)将使用相同的共享 DLL。

【讨论】:

  • 让我问你这个问题,有没有一种简单的方法可以让客户端应用程序轻松解释从服务或 dll 返回的对象?例如,AppNamespace.Data.MyMethod 返回 List,但服务返回 List。即使它们是完全相同的对象,它也会感到困惑,因为它不在同一个命名空间中。
  • 如果您有一个共享 DLL,其中包含 DLL 和服务都使用的类,则可能是可能的。如果您有一个从共享 DLL 返回类的服务方法,例如 AClass MyMethod(),那么代理代码在客户端看起来会完全相同,因为您将返回一个实际的类,而不是 Data契约,即类不会自动生成,因此客户端会期望在共享 DLL 中本地找到类。您的 DLL 也将使用相同的共享 DLL。这样,DLL 和服务都将引用同一共享位置中的类。
  • 好吧,是的,在我今天接近尾声的时候,我能够非常接近。如果可能的话,我认为我的下一步是将我的服务引用添加到我的 data.dll 中,以便我的所有数据操作都捆绑到一个包中以供客户端或服务器使用。我正在努力使它尽可能地可重复使用,并且足够容易让下一个追随我的人能够捡起它。感谢您的时间。你们在stackoverflow上都像我的同事一样,因为我没有。
  • 给服务器版本的dll,启动服务器。当我为客户端版本提供服务引用时,它会将其放在自己的命名空间下。 ClientAppNamespace.ServiceReference1.Class1.GetClass 返回一个 ClientAppNamespace.ServiceReference1.Class1 对象。而且我没有向 dll 中的类提供 DataContract。但是,添加服务引用会为其生成自己的值。我的假设是 VS 正在尝试使用 Svcutil 变得聪明。
  • 我会告诉你什么是有效的。我能够告诉我的客户将我的 DLL 引用重用于服务引用将自动生成的类型并解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多