【问题标题】:Moving WCF contracts to a separate dll将 WCF 合同移动到单独的 dll
【发布时间】:2025-12-22 10:35:12
【问题描述】:

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

当我从客户端使用这些接口以生成代理时,DLL 中的这些接口是否必须具有[ServiceContract] 属性?

知道什么是 Dll 的最佳命名方式,它将只有合同和 DTO 在客户端和服务器之间共享。

【问题讨论】:

  • “手动生成代理”是什么意思?据我了解,您想通过重用现有程序集中的类来生成代理。是这样吗?

标签: c# .net wcf


【解决方案1】:

将 WCF 数据和服务合同放在单独的程序集中是很常见的做法。在我之前的项目中,我们使用Company.OurProject.Contracts.dll 之类的命名。 我认为要通过重用现有类来生成代理,您应该将服务合同的接口(标有[ServiceContractAttribute] 的接口)和相应的数据合同放入该程序集。我会避免将服务的实际实现放在那里。

这是关于 SO 的另一个很好的答案,可以更深入地了解选择“在引用的程序集中重用类型”时可以重用的内容:WCF Service Reference generates its own contract interface, won't reuse mine

【讨论】:

    【解决方案2】:

    这是常见的,也许是推荐的方法。

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

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

    【讨论】:

    • 为什么保留命名空间并且其中没有名称“contracts”很重要?为了向后兼容?
    • @xr280xr - 如果您没有在 ServiceContract 属性中设置自定义命名空间,我的意思是将它移动到另一个您不想更改命名空间的程序集。这将导致任何现有客户之间的合同不匹配。
    【解决方案3】:

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

    【讨论】:

    • 另外,如果您共享二进制文件,我会避免使用生成的代理。我发现它是一种使用 WCF 的更清洁的方式。您可以直接使用代理,而不是生成包装代理的代码。
    最近更新 更多