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

C# 作为插件加载不同web引用的结构,c#,.net,design-patterns,web-reference,C#,.net,Design Patterns,Web Reference,我们在C#NET中开发了一个应用程序,它使用SOAP将数据(客户、订单)同步到PHP电子商务应用程序 PHP应用程序的WSDL作为.NET2.0Web引用添加到我们的应用程序中,因此.NETFramework生成与SOAPWeb服务通信的类和函数。 例如,我们可以发送如下股票信息: catalogInventoryStockItemUpdateEntity stock = new catalogInventoryStockItemUpdateEntity(); stock.is_in_stock

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

PHP应用程序的WSDL作为.NET2.0Web引用添加到我们的应用程序中,因此.NETFramework生成与SOAPWeb服务通信的类和函数。 例如,我们可以发送如下股票信息:

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的引用放在一个单独的类/项目中。

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

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

  • 将服务引用保存到它的特定web服务实例
  • 对该服务进行任何特定的分配或逻辑。例如,将
    10
    分配给
    stock.qty
  • 提供应用程序可能用来干扰插件中实现的逻辑的回调/事件。例如,您可以让插件公开一个名为BeforeStockSubmitted的事件,您可以在应用程序中对提交给服务的数据进行验证或检查
  • 您的插件主机(应用程序或其模块)应:

  • 为所有插件公开一致的对象模型。您应该为插件将使用的所有实体提供一定程度的抽象(例如
    sessionId
    stock
    ,等等)
  • 进入插件的数据也应该被抽象。因此,您可以在主机中拥有一个
    IStockInfo
    接口,每个插件都应该受到约束,以提供自己的实现。当插件处理特定部分时,主机可以填充这些对象的公共属性