将WCF合同移动到单独的dll文件

4

我希望将WCF合同接口移动到第三个DLL,并在手动生成代理时从客户端开始使用它们。

当我从客户端消费它们生成代理时,这些DLL中的接口是否必须有 [ServiceContract] 属性?

您有什么最好的命名方式来命名只包含契约和数据传输对象(DTO)以在客户端和服务器之间共享的DLL吗?


“手动生成代理”是什么意思?据我所理解,您想通过重用现有程序集中的类来生成代理。是这样吗? - Andriy Buday
3个回答

5
把WCF数据和服务契约放到不同的程序集中是非常普遍的做法。在我之前的项目中,我们使用了类似于“Company.OurProject.Contracts.dll”的命名方式。
我认为为了重用现有的类生成代理,你应该把服务契约(那些带有“[ServiceContractAttribute]”标记的接口)和相应的数据契约放到这个程序集中。我会避免在其中放置服务的实际实现。
这里有另一个很好的SO答案,更深入地介绍了当选择“在引用的程序集中重用类型”时可以重用哪些内容: WCF Service Reference generates its own contract interface, won't reuse mine

1

这是一种常见且可能推荐的方法。

是的,您应该将服务合同放在服务接口上,该接口将位于合同dll中。

请记住,命名空间不必与dll的名称匹配。假设您当前的程序集类似于CompanyName.Technology.Service.dll,具有类似于CompanyName.Technology.Service的命名空间,则应将合同提取到另一个程序集中,但保持命名空间相同(前提是仍然有意义),并具有CompanyName.Technology.Service.Contracts的程序集名称。您不希望在名称中包含“contracts”的命名空间。


为什么保留命名空间并且不在其中使用名称“contracts”很重要?为了向后兼容性? - xr280xr
1
@xr280xr - 我想表达的是,如果您在ServiceContract属性中没有设置自定义命名空间,将其移动到另一个程序集中时,您不希望更改命名空间。这将导致任何现有客户端之间的契约不匹配。 - Bronumski

0

我使用 *.ServiceContracts.dll,因为我的系统中最终会有多个契约程序集。例如,DataContracts.dll 用于访问数据存储。


此外,如果您要共享二进制文件,我建议避免使用生成的代理。我发现这是一种更清晰的使用 WCF 的方式。您可以直接使用代理而不是包装代理的生成代码。 - Rory Primrose

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