我正在设计一个包含三个项目的新解决方案:
“服务器” - 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()”来反映它们。我猜各种命令类是服务合同的一部分,所以也许这是要走的路?编辑:看起来这有同样的问题,只找到加载的程序集。
任何想法都非常感谢!这是可以实现的还是我需要重新考虑我的架构?!
提前致谢。