作为插件加载不同web引用的结构

本文关键字:web 引用 结构 插件 加载 | 更新日期: 2023-09-27 18:12:29

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

PHP应用程序的WSDL作为。net 2.0 web引用添加到我们的应用程序中,因此。net框架生成与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的引用放在一个单独的类/项目中。

作为插件加载不同web引用的结构

首先,为了给你的应用添加插件支持,你可以使用微软的可扩展性框架(MEF)。如果你被限制使用。net 2.0,那么还有其他自定义方式来发现和加载插件(通过单独的应用程序域,或者直接将它们加载到主应用程序域)。

在设计上,我会让每个插件:

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

你的插件主机(应用程序,或它的一个模块)应该:

    为所有插件公开一致的对象模型。您应该为插件将使用的所有实体提供一定程度的抽象(例如sessionId, stock等)。进入插件的数据也应该被抽象。所以你可以在主机上有一个IStockInfo接口,每个插件都应该提供自己的实现。主机可以填充这些对象的公共属性,而插件则负责特定部分。