WCF 服务已知类型设计问题

本文关键字:问题 类型 服务 WCF | 更新日期: 2023-09-27 18:34:16

我正在设计一个新的解决方案,它将包括三个项目:

"服务器" - WCF 服务

"客户端" - 将调用 WCF 服务的 winforms 应用

"ServiceContract" - 包含一些基类和 WCF 服务协定(接口(的类库。这显然会被服务器引用,也会被客户端引用(我使用的是ChannelFactory而不是让VS生成服务引用(。服务合同如下所示:-

[ServiceContract]
[ServiceKnownType("GetCommandTypes", typeof(CommandTypesProvider))]
public interface INuService
{
    [OperationContract]
    bool ExecuteCommand(CommandBase command);
}

这是一个非常基本的操作 - 客户端创建一个"命令"对象并将其发送到服务器执行。将有许多不同的命令,所有命令都继承自CommandBase(此基类驻留在"ServiceContract"项目中(。由于我在 WCF 操作签名中使用基类,因此必须指定使用 ServiceKnownType 属性动态执行的已知类型。这引用了一个帮助程序类 (CommandTypesProvider(,该类返回从 CommandBase 派生的所有类型。

我创建了一个简单的概念证明,其中包含驻留在"ServiceContract"项目中的几个派生命令类。因此,帮助程序类只需反映正在执行程序集中的类型。这一切都很好用。

现在在我的"真实"解决方案中,这些命令类将位于不同的项目中。这些项目将引用 ServiceContract 项目,反之亦然,这使得帮助程序很难(或不可能?(反映"命令"程序集。所以我的问题是,如何提供已知类型?

我考虑过的选项:-

    "服务器"和"客户端"项目
  • 将引用"服务合同"项目各种"命令"项目。我的助手可以通过AppDomain.CurrentDomain.GetAssemblies()进行反射,但这失败了,因为"命令"程序集并未全部加载(我可以通过在每个程序集中引用一个类型来强制执行此操作,但这感觉不对 - 我希望它是一个动态的、可插入的架构,并且不必在添加新命令项目时修改代码(。
  • 在配置中指定已知类型。同样,如果应用程序是动态的,而不是每次添加命令类时都必须更新配置,那就太好了。
  • 有没有办法访问客户端和服务器上的基础数据合同序列化程序,并向其传递已知类型?我想我仍然会遇到同样的问题,即除非它们已加载,否则无法反映程序集。
  • 重构内容以使服务协定项目能够引用各种命令项目。然后,我可以使用"Assembly.GetReferencedAssemblies(("来反映它们。我想各种命令类服务契约的一部分,所以也许这是要走的路?编辑:看起来这具有仅查找加载的程序集的相同问题。

任何想法都非常感谢!这是可以实现的,还是我需要重新考虑我的架构?!

提前谢谢。

WCF 服务已知类型设计问题

要考虑的一件事是使用 DataContractResolver。

资源很少:

WCF 扩展性 – 卡洛斯的数据协定解析器

使用 DataContractResolver 构建可扩展的 WCF 服务接口 作者:Kelly

动态配置已知类型 - Youssef 介绍 DataContractResolver

感谢您对数据合同解析器的回复。我可能会正常走这条路,但是当我使用温莎时,我能够想出一个解决方案。

对于任何感兴趣的人,我在我的每个"命令"项目中都添加了一个温莎安装程序(IWindsorInstaller(,这些项目使用温莎的container.Install(FromAssembly.InDirectory...运行。这些安装负责注册该项目中所需的任何依赖项,此外,它们还注册了我的已知类型帮助程序可以从容器中解析的所有命令类。