【问题标题】:Encapsulating a Service Reference封装服务引用
【发布时间】:2011-05-27 02:51:25
【问题描述】:

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

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

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

有什么建议吗?

【问题讨论】:

  • encapsulate the whole service ?
  • 差不多。控制台应用程序根本不需要看到服务存在。他们只需要使用库中的类来做他们的事情。这些类中发生的部分事情涉及 Web 服务这一事实与它们无关,并且可能会在以后发生变化。
  • 所以它归结为创建一个 api 并使其适应服务。您在问题中谈论了很多关于配置文件的内容,但从未提及您尝试使用该服务做什么(这就是我问的原因;))
  • 我没有创建服务 - 我正在使用外部服务。
  • 当我说使其适应服务时,我的意思是使用您的服务。我现在正在输入一些东西。

标签: c# visual-studio-2010


【解决方案1】:

诚实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。这将保护您免受服务端的更改,提供可用于注入的接口,并允许您插入一些额外的逻辑来处理失败。

【讨论】:

  • 我想我会选择 #2 - 直到你提到它,我没想过将每个 app.config 的“包含配置文件”与构建脚本结合起来以复制共享配置到每个。我很欣赏第 1 条的答案,但这比我想处理的主要是头痛的要多。
【解决方案2】:

在花了一些时间处理其他事情之后,我回到了这个问题,并在here上找到了一个相关问题。 Trond 对这个问题的回答对我来说效果很好,而且比其他任何事情都简单得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2022-06-28
    • 1970-01-01
    相关资源
    最近更新 更多