1

我正在设计一个包含三个项目的新解决方案:

“服务器” - 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 项目,而不是反之亦然,这使得帮助程序难以(或不可能?)反映“命令”程序集。所以我的问题是,我怎样才能提供已知类型?

我考虑过的选项:-

  • “Server”和“Client”项目将引用“ServiceContract”项目各种“command”项目。我的助手可以通过 进行反映AppDomain.CurrentDomain.GetAssemblies(),但这会失败,因为“命令”程序集并未全部加载(我可以通过在每个程序中引用一个类型来强制执行此操作,但这感觉不对 - 我希望它是一个动态的、可插入的架构,并且每当我添加一个新的命令项目时都不必修改代码)。
  • 在 config.xml 中指定已知类型。同样,如果应用程序是动态的,那就太好了,而不是每次添加命令类时都必须更新配置。
  • 有什么方法可以访问客户端和服务器上的底层 DataContractSerializer,并将其传递给已知类型?我想我仍然会遇到无法反映程序集的问题,除非它们已被加载。
  • 重构事物以使 ServiceContract 项目能够引用各种命令项目。然后我可以使用“Assembly.GetReferencedAssemblies()”来反映它们。我猜各种命令类服务合同的一部分,所以也许这是要走的路?编辑:看起来这有同样的问题,只找到加载的程序集。

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

提前致谢。

4

2 回答 2

1

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

少量资源:

WCF 可扩展性 – Carlos 的数据契约解析器

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

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

于 2012-05-16T22:43:53.227 回答
0

感谢您对 Data Contract Resolver 人员的回复。我可能通常会沿着这条路线走,但是当我使用温莎时,我能够想出一个使用它的解决方案。

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

于 2012-05-17T07:48:20.283 回答