WCF ServiceKnownType设计问题

时间:2012-05-15 10:49:05

标签: c# wcf

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

“服务器” - WCF服务

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

“ServiceContract” - 包含一些基类和WCF服务契约(接口)的类lib。显然,这将由服务器和客户端引用(我使用ChannelFactory而不是让VS生成服务引用)。服务合同如下所示: -

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

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

我创建了一个简单的概念证明,其中包含一些驻留在“ServiceContract”项目中的派生命令类。因此,助手类只需要反映执行程序集中的类型。一切正常。

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

我想过的选项: -

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

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

感谢有关Data Contract Resolver家伙的回复。我可能会正常走这条路线但是当我使用Windsor时,我能够提出一个使用它的解决方案。

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