2015-09-10 70 views
1

当我涉及到WCF和正常引用时,我正在努力理解某些引用方面。我有4个项目的解决方案。一个项目是服务,另外三个项目是服务引用。一个项目是其他三个传统引用的基类库。在另一个项目中使用引用的项目的WCF服务c#

我不得不以某种顺序更新服务引用,否则VS会混淆不明确的引用。这是由于WCF引用以某种方式通过正常引用导入的,所以有关于所有服务的两个名称空间。

我试图通过删除除基本库之外的所有服务引用来整理这一点,所以这将成为WCF连接的仲裁者并且不再含糊不清。但是我不确定甚至可以通过引用的方式在另一个项目中使用服务引用,并且服务正在抛出未找到异常的端点。我确信这些项目仍然有终点,但他们现在没有参考。我认为端点将通过基本参考来实现,但看起来不是。现在,基本库中的类也在基本版本和它们的服务版本之间发生冲突。

基本上引用去有点像这样:

WCFProject - >服务引用< - BaseLibrary - >附图< - SiteProject 1和2

我如何获得SiteProjects使用WCF服务,而服务家庭项目中的参考资料,还是BaseLibrary中的参考资料?

+0

我要补充一点,我将呼吁喜欢引用时BaseLibrary命名空间:using( BaseNameSpace.WCFName.ServiceClient等) – MoustacheDangerous

+0

如果您认为这可能会解决您的问题,那么可以从添加引用的位置为程序集内部添加服务引用。 – Biscuits

+0

我不知道@Biscuits我会检查这是否会有所帮助,但我认为我的问题是我想获得一个项目从一个被引用的项目继承服务引用,我不认为这是一回事。 – MoustacheDangerous

回答

0

我想你应该首先问“为什么这些引用服务引用,而不是二进制引用?”。

这可能是一个很好的理由,例如,该服务将部署到单独的计算机上,以解决方案中的其他项目。另一个原因是由服务提供的功能并不适合运行进程内,并且会使应用程序过于复杂。

在你的情况下,问题是:

“对于三个服务消费者,才有可能对我来说,只需通过一个二进制引用服务内部利用的服务的能力参考?”

如果答案是肯定的,那么稍做重构就可以简单地删除WCF服务库代码和服务引用。然后,您只需拥有三个项目,这些项目在运行时将所需的功能托管在进程中。

这是可取的,有几个原因,但这里有两个:

  1. 在处理代码是数量级比外的进程代码(如WCF服务)更快。
  2. 进程内代码管理和部署简单得多。

但是,如果你需要该服务的能力,以保持包裹在一个WCF服务,那么你仍然可以简化您的解决方案显着的:

  1. 移动服务进自己的解决方案,并
  2. 摆脱所有服务参考,并使用ChannelFactory<T>.CreateChannel()直接调用服务。

ChannelFactory的工作原理是允许您通过直接引用服务二进制文件来调用服务。这否定了对没有共享二进制相关性的服务引用的需求。

这种做法是可取的原因有很多,但这里有两个:

  1. 无需服务引用,大大简化你的代码。
  2. 当服务发生变化时,不需要更新任何内容;通过二进制引用可以获得更改,并且与使用进程中的程序集一样自然。

常常看到的WCF服务实例包括作为解决方案,其中在溶液中的其他项目消耗经由服务引用的服务内的项目。这在我看来并不是很好的设计。首先,一个服务应该是从来没有驻留在一个单一的解决方案与消费者,其次,消费者应该直接消费服务,没有使用服务引用,除非绝对必要。

我不熟悉不使用参考的过程,而您的 解决方案看起来很有趣。我会读到

请做。在您完全控制服务和消费者的情况下,服务参考没有位置。我知道这听起来是规定性的,但经验证明它很有用。

数据库模型库驻留在BaseLibrary,这些都是在服务项目

哪个项目的引用该组件所用的参考方式 ?如果服务使用它,那么您可以使用该服务将其从解决方案中移出。但客户也使用它?如果是这样,这是否意味着客户端和服务都访问相同的数据库?否则,为什么他们都使用相同的数据模型?

将服务移动到另一个解决方案不会否定 只有一个地方为项目间代码的这种优势吗?

我强烈反对为项目间代码提供一个地方总是将​​项目集中在一个解决方案中的好理由。然后,您可以结束彼此完全无关的项目(从业务,技术或能力角度)共享解决方案,以便他们可以从这种“优势”中受益。在我看来,更好的策略是将普通程序集移除到自己的解决方案中,然后将其发布到本地NuGet服务器。任何需要此程序集的项目都可以从NuGet中检索它。

+0

服务将部署在不同的机器上,因此需要参考。我不熟悉不使用引用的过程,并且您的解决方案看起来很有趣。我会详细阅读。数据库模型库驻留在BaseLibrary中,这些在服务项目中作为参考使用。将服务移动到另一个解决方案不会否定只有一个地方用于项目间代码的优势吗? @Tom Redfern – MoustacheDangerous

+0

@MoustacheDangerous - 请参阅根据您的评论更新我的答案。 –

+0

非常感谢您的精心制作@Tom Redfern。在这种情况下,我认为我没有时间将这些服务移出解决方案,但我认为我已经通过您所说的其他方式意识到了这个问题。我做了一些糟糕的设计决定,现在正在付出代价。感谢您的详细解答。 – MoustacheDangerous

相关问题