我目前正在工作的一个项目中有一个情况让我整个周末都心烦意乱。首先,我需要解释一下我的场景,以及我考虑过的可能的解决方案。
我正在编写一个复合 WCF 服务,它将聚合大量外部 API。这些 API 是任意的,它们的存在就是这个解释所需要的。
可以在整个开发期间添加和删除这些服务。我的 WCF 服务应该能够使用多种方法(REST、SOAP 等)使用服务。对于此示例,我专注于通过在代码中手动创建请求来与外部 APIS 通信。
例如,我们可能有两个 API 的 ServiceX 和 ServiceY。
ServiceX 是通过 POST 使用请求正文中的数据专门发送 Web 请求来使用的。
ServiceY 由 POST 发送一个 Web 请求,并将数据附加到 URL(是的......我知道这应该是一个 GET,但我没有编写外部 API,所以别跟我说教。)
为了避免冗余、重复的代码,我使用命令模式包装了网络请求,并使用工厂来构建请求。
对于 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
}
}
这使我能够在需要发送数据时将数据绑定(bind)到请求的方式完全分开,并且基本上,我还可以添加其他类来处理 GET 请求。我不确定这是否很好地使用了这些模式。我在想一个替代方案可能是使用策略模式并为我可能需要使用的不同请求方法指定策略对象。比如下面的:
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();
}
}
我开始认为 Strategy 模式可能是更简洁的解决方案。
有什么想法吗?
最佳答案
我会同时使用两者。
命令是封装请求和隐藏实现细节的最佳实践。即使您只有一种请求,您也应该使用它,因为它可以促进更简洁的代码。从本质上讲,考虑“关于如何执行和处理请求,我的代码的其余部分需要知道的绝对最小值是多少”是一种很好的做法,这将引导您进入命令模式。
策略基本上是在运行时配置您的系统,使用通用的、一致的方式来处理操作的某些方面,在这种情况下生成请求。这也是一个很好的测试实践,因为您可以用策略/请求工厂的测试实现来代替伪造的实际连接等。
关于c# - 设计模式场景——我应该使用哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11388739/