2011-03-08 33 views
5

我相信这肯定是一个很常见的问题。我有两个WCF服务,基本上将标准访问和管理访问暴露给一个更大的服务。从WCF服务转换类型

每种服务都有类似的方法FooFoo需要在我的服务中定义的TemplateInfo类型的参数。

在我的客户端,我参考了ClientAdminClientClient.Foo(TemplateInfo)预计Client.TemplateInfo,而AdminClient.Foo(TemplateInfo)预计AdminClient.TemplateInfo。我知道一旦服务达到Client.TemplateInfoAdminClient.TemplateInfo是同样的事情。

我想弄清楚如何实例化TemplateInfo和/或强制它使用客户端和管理方法。有相当数量的代码来创建这个对象,所以我希望不要为每种类型重复。

类型是在共享程序集中定义的,我在代理中使用“重用类型”。但是我得到了两种不同的类型,因为我有两个服务引用。

这样做会很棒,就像(AdminClient)TemplateInfo,但也许我会创建一个克隆方法来转换类型。

回答

4

没有办法做到这一点。他们是不同的类型。

您可以将该类型放入由服务和客户端引用的类库中。您可以告诉“添加服务引用”以重用类型(这是默认值),然后它将是类库中使用的类型。


请注意,客户端应用程序还需要引用与这两个服务相同的类库。

+0

谢谢,最后一个注释是我的场景中的关键。我已经在两项服务中引用了它。 – earthling 2011-03-17 01:10:08

+0

@John,你能帮忙吗这里http://stackoverflow.com/questions/43506726/wcf-deserializing-choosing-type-in​​-depends-on-some-field-once-and-for-all-de请吗? – 2017-04-20 16:24:33

1

或者完全生成服务引用,您可以将服务的类型放入客户端和服务之间的共享程序集中,并在生成客户端类时检查“引用程序集中的重用类型”或类似内容。

1

你可以这样做,但它通常不被认为是一个好主意。原因是它将您的客户和服务紧密结合在一起。只有在控制客户端和服务的情况下才考虑这样做,并且准备好以下事实,即当您对某个服务进行更改时,可能会破坏客户端。

理查德已经打败了我,并提供了一些关于如何使用visual studio来做到这一点的提示。

一个面向服务的架构的主要原则是“服务共享模式和契约,而不是阶级”。

有很多很好的文章解释这个比我能做得更好。维基百科是一个很好的开始,或者当WCF有一个很酷的名字时,这篇文章就回来了。 http://msdn.microsoft.com/en-us/magazine/cc164026.aspx

+0

我明白你的观点。这适用于与两种服务相同的解决方案中的一些功能测试。我想在服务级别上需要进行一些其他更改,以实现服务之间的类似功能。 – earthling 2011-03-08 20:12:18