封装服务引用

本文关键字:引用 服务 封装 | 更新日期: 2023-09-27 17:56:40

我正在构建一组控制台应用程序,这些应用程序都需要引用Web服务。 我有一个类库,其中包含这些应用程序的许多共享功能,包括 Web 服务(已添加为服务参考)。 我知道处理此问题的"正确"方法是将块从类库的 app.config 复制到每个控制台应用程序,但这会导致维护问题。 我还找到了使用共享 app.config 文件的替代方案,并从每个应用程序的配置中引用它。 这更好,但仍然不是很好 - 它仍然涉及手动配置每个新应用程序,并要求我确保共享配置文件位于所有应用程序都可以访问的位置。

我正在寻找的是三件事之一(按满意度递减顺序):

  1. 一种将整个服务以及访问它所需的所有内容封装到从类库生成的 dll 中的方法。
  2. 一种自动将相关配置信息复制到每个控制台应用的生成目录(例如生成后脚本)的方法。
  3. 解释为什么前两者都不可行。(在这种情况下,我将使用共享配置)

有什么建议吗?

封装服务引用

诚实 2 是微不足道的。 您可以轻松地将配置文件复制到构建目录。 一个简单的谷歌搜索可以给你你需要的一切。

对于第 1 部分,您在这里有选项,我建议简单地以接口形式为您的服务定义 API。 然后使用 DI 通过 dll 插入"实现"。 它一直使用适配器模式完成,然后使用类似 Unity 的东西进行运行时实现。

伪:

interface IMyServiceAdaptor {
   void SomeMethod(params );
   void SomeMethod2(params );
}
public class ServiceAdaptor : IMyServiceAdaptor{
    #psudo code
    ServiceProxyClient client  { get;set;}
    public void SomeMethod(parms){
       var convertedParams = Convert(parms);
       return client.SomeMethod(convertedParams );
   }
   ...etc
}
public class MyClient {
  [Dependancy]
  IMyServiceAgent agent { get;set;}
  public MyClient(){
     #resolve
 }

}


概念很简单。 您有一个服务的内部表示形式(IMyServiceAdaptor)。 重要的是,它完全独立于实际调用服务的底层代理(服务引用)调用。 这个想法是你为你的服务创建一个友好的界面,你与它接口。 您始终调整服务以满足应用程序接口 API。 这将保护您免受服务端更改的影响,提供可用于注入的接口,并允许您插入一些额外的逻辑来处理故障。

在花了一些时间做其他事情后,我回到了这个问题,并在这里发现了一个相关的问题。 Trond对这个问题的回答对我来说很好,而且比其他任何事情都简单得多。