【问题标题】:Encapsulating WCF Proxies in Static Classes在静态类中封装 WCF 代理
【发布时间】:2011-09-21 21:14:27
【问题描述】:

我正在设计一个 Web 服务,它将根据给定对象的属性(例如“请求”)调用不同的外部 Web 服务。对这些 Web 服务的引用是通过 Visual Studio 2008 中的“添加 Web 引用”菜单添加的,如您所知,该菜单为每个继承自 System.ServiceModel.ChannelBase<ISomeInterface> 的端点创建一个代理类(其中 ISomeInterface 是由特定服务的 WSDL)。

问题是我想将所有这些代理封装在一个 ServiceManager(例如)静态类中,其中包含例如所有代理的内部列表,这样一方面,所有调用给定的服务可以通过ServiceManager 而不是分散在主应用程序周围,另一方面,可以通过简单添加对ServiceManager新的代理类。

我想过设计ServiceManager 喜欢

public static class ServiceManager
{
    #region Properties

    public static Dictionary<string, TProxy> ServiceList { get; private set; }

    #endregion
}

但我不知道应该用什么替换TProxy,以便可以使用ServiceManager.ServiceList["ServiceName"] 调用所有不同的代理。谁能帮我解决这个问题?

【问题讨论】:

    标签: wcf .net-3.5 proxy encapsulation


    【解决方案1】:

    不要重复使用代理。重新实例化它们。区分代理的魔术字符串同样糟糕。

    您最好使用返回服务代理的静态工厂,而不是只保留它们的一个实例。

    类似这样的:

    public static class ServiceFactory
    {
        public static Proxy CreateProxy();
        public static Proxy2 CreateProxy2();
        // etc.
    }
    

    【讨论】:

      【解决方案2】:

      由于每个服务实现不同的接口,它必须是对象...除非您可以创建一个通用的基本接口,让代理从该接口继承,然后创建一个 List

      为什么您不能在每个代理的班级中只拥有一个属性?至少你可以以强类型的方式访问代理。

      【讨论】:

      • ClientBase 实现了ICommunicationObject,这是一个很好的代理基础接口。但代理不是单例,它们是过渡对象。
      • 确实如此。您可能希望 ServiceManager 成为单例。并且要明白,一旦代理处于故障状态,就必须重新实例化它。
      • 差不多。它们还实现了IDisposable,尽管你永远不应该在它们周围实际使用using 语句。想象一下……一个可分散的单例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多