封装服务参考

封装服务参考

问题描述:

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

我正在寻找的是以下三种情况之一(以下降的满意度为序):

  1. 的一种方式封装的全程服务,以及一切必要对其进行访问,到这是一个从生产的dll类库。
  2. 一种将相关配置信息自动复制到每个控制台应用程序的构建目录(如构建后脚本)的方法。
  3. 解释为什么前两者都不可行。 (在这种情况下,我将使用共享配置)

有什么建议吗?

+0

'封装整个服务'? – Nix 2011-05-16 16:37:49

+0

非常。控制台应用程序根本不需要看到该服务是否存在。他们只需要使用库中的类来完成他们的工作。事实上,这些类中发生的部分事情涉及Web服务与他们无关,并可能在以后发生变化。 – Bobson 2011-05-16 16:41:17

+0

因此,它涉及到创建一个API并使其适应服务。你会在你的问题中谈论很多关于配置文件的问题,但是从来没有提到你要用服务来做什么(这就是为什么我要问的原因;)) – Nix 2011-05-16 16:45:03

经过一段时间的工作其他事情后,我回到这个问题,并找到了一个相关的问题here。 Trond对这个问题的回答对我来说工作得很好,而且比其他任何事情都简单得多。

诚实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。这将屏蔽您在服务端的变化,提供您可以用于注入的接口,并允许您插入一些额外的逻辑来处理失败。

+0

我想我会去#2 - 直到你提到它,我没有想到将每个app.config的“包含配置文件”与构建脚本相结合,以将共享配置复制到每个配置文件中。我非常感谢#1的答案,但这比我想要解决的问题要多得多,只是头痛而已。 – Bobson 2011-05-17 14:25:32