封装服务引用

时间:2011-05-16 16:35:26

标签: c# visual-studio-2010

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

我正在寻找的是三件事之一(满意度下降):

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

2 个答案:

答案 0 :(得分:3)

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

对于第1部分,您可以在此处选择,我建议您只需在界面表单中为您的服务定义API。然后使用DI通过dll插入“实现”。它始终使用Adapter Pattern完成,然后使用类似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。这将保护您免受服务端的更改,提供可用于注入的接口,以及允许您插入一些额外的逻辑来处理故障。

答案 1 :(得分:1)

在花了一些时间处理其他事情之后,我回到了这个问题,发现了一个与here相关的问题。 Trond对这个问题的回答对我来说很合适,并且比其他任何东西都简单得多。