集成 WCF 服务
本文介绍如何动态加载 WCF 服务(无需事先了解服务的协定),设置其参数并按顺序调用它们。
引言
本文试图呈现的基本概念是如何动态订阅 WCF 服务,而无需事先了解服务的协定定义。加载这些服务后,用户可以选择要从这些服务中调用的所需操作,并通过一个简单的序列器按顺序调用它们。 用户还可以为特定操作的任何参数设置值。 通过这种概念,可以集成独立位于不同位置的服务,从而形成更大规模的解决方案。
请注意,本文仅试图说明使用 WCF 服务的基本可能性。 文章中省略了许多更高级的可能性,并在下面的 Todo 部分中提出了建议。
致谢
该示例项目引用了以下优秀作品
Vipul Modi 的 WCF 动态编程
Luyan 的通用快速方法调用器
Using the Code
这个概念非常简单。 有服务托管在某个地方,准备被订阅。 这些只是普通的 WCF 服务。 客户端应用程序可以通过要求用户输入所需服务的 URL 来加载这些服务。 对于示例项目,名为 ExampleService
的服务托管在以下 URL 上
public class ExampleService : IWorkWithIntrinsic
{
#region IWorkWithIntrinsic Members
public void WorkWithIntegers(int first, int second)
{
Console.WriteLine("IWorkWithIntrinsic.WorkWithIntegers was called.");
Console.WriteLine("\t1st Integer: " + first);
Console.WriteLine("\t2nd Integer: " + second);
}
public string WorkWithString(string myString)
{
Console.WriteLine("IWorkWithIntrinsic.WorkWithString was called.");
Console.WriteLine("\tString: " + myString);
return myString + " returned from server.";
}
public double WorkWithDouble(double myDouble)
{
Console.WriteLine("IWorkWithIntrinsic.WorkWithDouble was called.");
Console.WriteLine("\tDouble: " + myDouble);
return myDouble + 1.0;
}
#endregion
}
用户可以通过转到“文件”,然后“加载服务”来加载(订阅)服务。 将出现以下对话框。 用户应选中“加载所有协定”复选框,然后单击“确定”。

所有已加载的服务(代理)将显示在树视图中。 然后,用户可以通过右键单击操作节点并选择“添加操作”来选择要添加到序列器的所需操作。 如下图所示

最后,用户可以单击“播放”按钮以执行所有选定的操作。

以下屏幕截图描述了服务器端发生的事件序列。

解决方案中每个项目的简要说明
Integrator.Framework.DynamicProxyModel
– 使动态代理创建成为可能的项目。 几乎所有内容都来自 Vipul Modi 的上述优秀作品。Integrator.Framework.ServiceManagerModel
– 用于管理所有加载的代理及其操作和参数的项目。Integrator.Framework.Sequencer
– 包含序列器组件。Integrator.Framework.TestServer
– 服务宿主应用程序Integrator.UI.Shell
– 承载所有 UI 组件的 CAB Shell。Integrator.UI.Sequencer
– 承载序列器的 UI。Integrator.UI.LoadedServices
– 承载所有加载的代理的 UI。Integrator.UI.ParameterEditor
– 承载参数编辑器的 UI。Integrator.UI.Common
– 包含所有 UI 组件的常量和事件参数。
运行示例项目
将 Integrator.Framework.TestServer
设置为活动项目,然后从 Visual Studio 2005 中按 Alt-F5 执行它。
将 Integrator.UI.Shell
设置为活动项目,然后从 Visual Studio 2005 中按 F5 执行该项目。 按照上面“基本概念描述”部分中描述的步骤执行。
待办事项
以下项目是项目的计划功能,但我找不到时间来实现。
事件代理系统 – 与序列器一起工作,以构建发布/订阅模型。 想法是,一旦完成一个操作,其返回参数可以用作另一个操作的输入参数。
处理复杂参数 - 目前,已经包含了处理复杂参数的代码,但只是半成品。
提供 UI - 让服务提供自己的 UI(可能是 XAML)。
历史
- 2008 年 4 月 25 日:首次发布