我目前正在工作的一个项目中遇到一个情况,这让我整个周末都心神不宁。首先,我需要解释我的场景,以及我考虑过的可能解决方案。
我正在编写一个复合 WCF 服务,它将聚合大量外部 API。这些 API 是任意的,它们的存在就是这个解释所需要的。
这些服务可以在整个开发期间添加和删除。我的 WCF 服务应该能够使用多种方法(REST、SOAP 等)来使用这些服务。对于此示例,我将重点关注通过在代码中手动创建请求来与外部 APIS 进行通信。
例如,我们可能有两个 API 的ServiceX和ServiceY。
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
}
}
这使我可以在需要发送数据时将数据绑定到请求的方式清晰地分开,本质上,我还可以添加其他类来处理 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();
}
}
我开始认为策略模式可能是更清洁的解决方案。
有什么想法吗?