我正在设计一个包含三个项目的新解决方案:
“服务器” - 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项目,而不是相反,这使得帮助程序很难(或不可能)反映“命令”程序集。所以我的问题是,我如何提供已知类型?
我想过的选项: -
AppDomain.CurrentDomain.GetAssemblies()
反映出来,但这失败了,因为“命令”程序集并非全部加载(我可以通过引用每个中的类型强制执行此操作,但这感觉不对 - 我希望它是一个动态,可插入的体系结构,每当我添加新的命令项目时都不必修改代码。)任何想法都非常感谢!它是可以实现的还是我需要重新考虑我的架构?!
提前致谢。
答案 0 :(得分:1)
要考虑的一件事是使用DataContractResolver。
资源很少:
卡洛斯WCF Extensibility – Data Contract Resolver
凯莉Building Extensible WCF Service Interfaces With DataContractResolver
YoussefConfiguring Known Types Dynamically - Introducing the DataContractResolver
答案 1 :(得分:0)
感谢有关Data Contract Resolver家伙的回复。我可能会正常走这条路线但是当我使用Windsor时,我能够提出一个使用它的解决方案。
对于任何感兴趣的人,我在每个“命令”项目中添加了一个Windsor安装程序(IWindsorInstaller
),这些项目使用Windsor的container.Install(FromAssembly.InDirectory...
运行。这些安装负责注册该项目中所需的任何依赖项,另外它们还注册了我的已知类型帮助程序可以从容器中解析的所有命令类。