设计模式场景 - 我应该使用哪个?

The*_*boy 5 c# design-patterns

我有一个项目的情况,我目前正在工作,整个周末都让我的思绪焦躁不安.首先,我需要解释我的场景,以及我考虑过的可能的解决方案.

我正在编写一个复合WCF服务,它将聚合大量的外部API.这些API是任意的,它们的存在就是这种解释所需要的.

可以在整个开发期间添加和删除这些服务.我的WCF服务应该能够使用多种方法(REST,SOAP等)来使用服务.对于此示例,我通过在代码中手动创建请求来专注于与外部APIS进行通信.

例如,我们可能有两个API的ServiceXServiceY.

ServiceX被消耗POST荷兰国际集团与请求体中的数据具体为web请求.

ServiceY被消耗POST荷兰国际集团与附加到URL中的数据的Web请求(是的......我知道这应该是一个GET,但我没写外部API,所以不教训我了.)

为了避免冗余的重复代码,我使用命令模式包装了Web请求,并使用工厂来构建请求.

对于ServiceX,需要对数据进行编码并将其放入请求主体,与ServiceY相反,其中数据需要迭代并放在Post字符串上.

我有一个类结构,如下所示:

public abstract class PostCommandFactory
{
      public ICommand CreateCommand();
}

public class UrlPostCommandFactory:PostCommandFactory
{
      public ICommand CreateCommand()
      {
              //Initialize Command Object Here
      }
}

public class BodyPostCommandFactory:PostCommandFactory
{
      public ICommand CreateCommand()
      {
              //Initialize Command Object Here
      }
}


public interface ICommand
{
      string Invoke();
}

public class UrlPostCommand:ICommand
{
      public string Invoke()
      {
         //Make URL Post Request
      }
}

public class BodyPostCommand:ICommand
{
      public string Invoke()
      {
         //Make Request Body Post Request
      }
}
Run Code Online (Sandbox Code Playgroud)

这允许我在需要发送时将数据绑定到请求的方式清晰地分开,实质上,我还可以添加其他类来处理GET请求.我不确定这是否很好地利用了这些模式.我在想一个替代方案可能是使用策略模式并为我可能需要使用的不同Request方法指定策略对象.如下:

public class RequestBodyPostStrategy:IPostStrategy
{
      public string Invoke()
      {
          //Make Request Body POST here
      }
}

public class UrlPostStrategy:IPostStrategy
{
      public string Invoke()
      {
          //Make URL POST here
      }
}

public interface IPostStrategy
{
      string Invoke();
}

public class PostContext
{
      pubic List<IPostStrategy> _strategies;
      public IPostStrategy _strategy;
      public PostContext()
      {
           _strategies = new List<IPostStrategy>();
      }

      public void AddStrategy(IPostStrategy strategy)
      {
            _strategies.Add(strategy);
      }


      public void SetStrategy(IPostStrategy strategy)
      {
           _strategy = strategy;
      }

      public void Execute()
      {
           _strategy.Invoke();
      }
}
Run Code Online (Sandbox Code Playgroud)

我开始认为战略模式可能是更清洁的解决方案.

有什么想法吗?

And*_*sen 3

我会同时使用。

命令是封装请求和隐藏实现细节的最佳实践。即使您只有一种请求,您也应该使用它,因为它可以促进更清晰的代码。从本质上讲,考虑“我的代码的其余部分需要了解如何执行和处理请求的绝对最小值是多少”是一个很好的做法,这将引导您进入命令模式。

策略基本上是在运行时使用通用、一致的方式配置系统来处理操作的某些方面,在本例中生成请求。这也是一个很好的测试实践,因为您可以替换策略/请求工厂的测试实现来伪造实际连接等。