将WCF服务引用添加到多个项目中

5
一些非常基本的问题。我是WCF的新手,正在构建一个包含服务项目、Web应用程序项目和一些用于业务逻辑等的类库项目的应用程序。
我将WCF托管在本地IIS上,并尝试向项目添加服务引用。
问题1:当添加引用时,我应该为每个项目单独添加服务引用,还是有办法可以在项目之间共享同一个服务引用?
我之所以问这个问题,是因为如果我添加单独的引用,每个引用都会有自己的命名空间。当我必须在项目之间传递相同的对象时,我会得到一个InvalidCastException错误,因为每个ServiceClient都有不同的命名空间。
例如:Site.Business.XDataService.XDataServiceClient().GetItem() 与 Site.Web.XDataService.XDataServiceClient().GetItem() 不同。
问题2:我在实现服务接口的类中指定了本地服务的地址,如下所示:
[ServiceBehavior(Namespace = "http://localhost:801/XDataService.svc", IncludeExceptionDetailInFaults = true)]
这似乎不太对。如果我将代码移动到另一个/生产环境,我显然需要再次更改这部分并重新编译。我在哪里可以指定这个(Web.Config?),以便我可以更改这个地址而不必重建我的应用程序?
感谢任何洞察力。谢谢!
2个回答

6
回答第一个问题,您可以将服务引用放在自己的项目中,并在需要访问该服务的所有其他项目中引用该项目。
基本上,所有服务引用都是.NET代码 - 命名空间、类等。
更好的是(!),对于WCF服务,您还可以免费获得一个接口(或多或少与您为服务定义的接口相同),因此在依赖注入方面做很好的事情,从而使测试等变得更加容易。

谢谢您的解释。但是,如果WCF项目也在同一个应用程序中,您会建议我创建两个项目,一个是服务主机,其中包含所有代码,另一个是服务客户端,我将其用作其他项目的参考吗? - Kalyan
1
是的,两个项目,以及您在其他项目中引用的服务客户端。 - Murph

4
第一个问题 - 这项服务就像任何其他代码一样。例如,数据库访问代码。你是否应该将其放在需要访问数据库的每个项目中?不应该 - 你应该将它放在其他项目可以引用的项目中。
至于你的第二个问题,你正在指定一个命名空间,但我认为你认为自己在指定服务终结点地址。命名空间就像C#代码命名空间 - 它基本上提供了进一步的标识和清晰度,以防你有多个具有相同名称的对象。通常你会使用类似于http://mywebsite.com/MyService/VersionNumberIfRequired或类似的命名空间。 地址本身是在配置中指定的。地址将根据环境/部署位置而变化 - 命名空间不应该改变。

谢谢!我知道在问题2方面我漏了什么。我会按照你的建议去做。 - Kalyan

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