1

我们在 C# .NET 中开发了一个应用程序,它使用 SOAP 将数据(客户、订单)同步到 PHP 电子商务应用程序。

PHP 应用程序的 WSDL 作为 .NET 2.0 Web 引用添加到我们的应用程序中,因此 .NET Framework 生成类和函数以与 SOAP Web 服务进行通信。例如,我们可以像这样发送股票信息:

catalogInventoryStockItemUpdateEntity stock = new catalogInventoryStockItemUpdateEntity();
stock.is_in_stock = 1;
stock.is_in_stockSpecified = true;
stock.qty = "10";
webserv.catalogInventoryStockItemUpdate(sessionid, itemcode, stock);

这很好用,但是我们经常在这样的情况下运行:我们的一位客户在 WSDL 中定义了附加(非标准)字段并希望在同步中使用这些字段。我们当前的做法是为这个客户创建一个新的代码分支,并更新 Web 引用以使用我们客户的特定 WSDL。

为了防止我们获得一长串无法维护的软件分支列表,我计划对我们的应用程序结构进行彻底检查。现在我想知道处理这个问题的最佳结构是什么。我正在考虑将 Web 引用放在它自己的类中并动态加载此 DLL,因此如果客户有非标准 WSDL,我们可以创建它自己的类并将其作为“插件”加载到我们的软件中。但是(例如)catalogInventoryStockItemUpdate 中的附加字段在我们的应用程序的主要部分中仍然不可用。

是否有任何工具可以帮助实现这一目标?我希望有一个用于同步的主要应用程序,并将所有客户特定的映射和对 WSDL 的引用放在一个单独的类/项目中。

4

1 回答 1

2

首先,要向您的应用程序添加插件支持,您可以使用Microsoft Extensibility Framework (MEF)。如果您受限于使用 .NET 2.0,那么还有其他自定义方法可以发现和加载插件(通过单独的应用程序域,或直接将它们加载到主应用程序域)。

至于设计,我会制作每个插件:

  1. 持有对其特定 Web 服务实例的服务引用。
  2. 对该服务进行任何特定的分配或逻辑。例如分配10stock.qty.
  3. 提供应用程序可以用来干扰插件中实现的逻辑的回调/事件。例如,您可以让插件公开一个名为的事件BeforeStockSubmitted,您可以在应用程序中对提交给服务的数据进行一些验证或检查。

您的插件主机(应用程序或其模块)应该:

  1. 为所有插件公开一致的对象模型。您应该为插件将使用的所有实体(例如,等)提供一定程度的sessionId抽象stock
  2. 进入插件的数据也应该被抽象化。因此,您可以IStockInfo在主机中拥有一个接口,并且每个插件都应该被限制为提供自己的实现。主机可以填充这些对象的公共属性,而插件负责特定部分。
于 2013-05-07T10:33:38.940 回答