【问题标题】:How To create Extensible WCF service如何创建可扩展的 WCF 服务
【发布时间】:2014-03-19 06:52:47
【问题描述】:

我需要从我的客户项目中调用的服务。要求是我可以更改和发布服务,但是在更改服务后不需要重建客户端。例如,假设我有服务可以帮助人们到达目的地

[ServiceContract]
IDestinationHelper
{
  [OperationContract]
  void ReachDestination(string person);
}

class ReachedByTrain:IDetinationHelper
{
  void ReachDestination(string person)
  {
    //Help the person to reach destination
  }
}

现在该服务正在帮助人们乘火车到达目的地,在这种情况下,我将从客户端调用 ReachedByTrain 服务,但假设有需求,我希望该人乘飞机到达,在这种情况下应该如何我继续进行而不更改或构建客户端。该功能应该是可插入的,并且客户端应该自动检测它

class ReachedByFlight:IDetinationHelper
    {
      void ReachDestination(string person)
      {
        //Help the person to reach destination
      }
    }

请提供有关如何完成的任何帮助或参考。

P.S 一次只有一种模式呈现给客户端。不管客户是否知道。

【问题讨论】:

    标签: c# .net wcf extensibility


    【解决方案1】:

    您有多种方式来实现可扩展性。

    界面在您的客户端中是固定的。构建处理不断变化的界面的代码很困难并且容易出错。不要那样做。

    因此,您需要保持界面完整并更改类的内部行为。

    在您的示例中,您的服务可以返回一个点列表作为到目标的路线和一个记录交通模式的字符串。现在您可以在不更改界面的情况下为它们添加各种运输方式和返回路线。

    当您添加新的可能的运输方式时,必须通知客户,以便可以将其呈现给用户,例如在 ComboBox 中。这意味着您需要在界面中返回所有可能的交通方式的方法。这样,您的客户端无需重新编译即可处理新的。它甚至可以在您删除模式时处理它。

    这样,您的客户就有了一份合同,而且合同永远不会改变。但是当您重建和重新部署服务时,您的方法可能会返回不同的内容。

    例子:

    本合同永远不会改变:

    [ServiceContract]
    IDestinationHelper
    {
      [OperationContract]
      IEnumerable<Waypoint> ReachDestination(string transportationMode);
    
      [OperationContract]
      IEnumerable<string> GetAvailabletransportationModes();
    }
    
    IDestinationHelperService : IDestinationHelper
    {
      public IEnumerable<Waypoint> ReachDestination(string transportationMode)
      {
         // decide return value by transportation mode. Use a switch statement, dependency injection, IoC containers, whatever you want
      }
    
      public IEnumerable<string> GetAvailabletransportationModes()
      {
         // decide return value by getting all modes from wherever you decided upon above.
      }
    }
    

    【讨论】:

    • 非常感谢您的回复。客户无需知道此人是如何到达目的地的。它应该只调用适当的服务(运输方式)来到达,并且一次只会出现一种方式。如何在技术上实现这一点。
    • 只要保持界面不变,您可以拥有任意数量的服务(一个用于火车,一个用于飞机)托管它们并让它们具有不同的 URL。或者你可以覆盖你拥有的那个。如果您想让所有客户乘坐飞机而不是火车,您需要做的就是重建和重新部署服务。唯一重要的是:不要改变界面。
    • 拥有不同的服务但​​具有相同的界面很好,但在这种情况下,每次我更改我认为需要客户端更改的服务时,我都需要更改端点。很抱歉,我是 WCF 的新手。
    • 如果您有 plane.yourdomain.com 和 train.yourdomain.com 托管服务,您可以让客户端指向 default.yourdomain.com 并在您的服务器中进行更改,以便默认子域有时指向一个,有时指向另一个。
    【解决方案2】:

    我认为您需要一个带有 [OperationContract] 的 [ServiceContract],它将“ModeOfTransport”作为参数并具有路由逻辑来创建 ReachByTrain 或 ReachByPlane 或 ReachByAnything 的对象,并从内部调用它[运营合同]。您可以从客户端调用 [OperationContract],它具有手头上的适当参数的路由逻辑。

    【讨论】:

      猜你喜欢
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 2011-05-06
      • 2011-02-24
      • 2013-04-15
      • 2022-01-25
      相关资源
      最近更新 更多