在我现在工作的项目中,我们通过他们的网络服务从 40 多个不同的供应商那里提取一些数据,然后将它们汇总在一起,然后再展示给我们的客户。
每个供应商都提供不同类型的服务(我们发送的一些请求是 SOAP 调用,一些是通过 POST 或 GET 的简单查询字符串,以及其他......)。
目前系统有点混乱,我们有一个基类,它有一个名为GetSupplierData(Request request)的抽象方法,每个单独的供应商类都覆盖该方法。问题是每个供应商类在该方法中做了完全不同的事情,在请求的不同部分设置超时等。我的任务是在所有供应商中实现一个通用的业务逻辑/计时/日志记录,所以我认为应该改变这个方法.
整个流程可以根据业务逻辑分为4个不同的阶段:
- 生成特定于供应商的请求
- 发送该请求并等待响应
- 将响应映射到通用格式(调用该类CommonResponse)
- 对CommonResponse进行后处理(这里的逻辑对所有供应商都是通用的,因此在基类中实现)
根据这个逻辑,我决定实现模板方法设计模式,我在基类中创建了一个业务逻辑方法和 3 个抽象方法,代表上述业务逻辑的前 3 个步骤:
public class SupplierBase
{
protected abstract XDocument generateRequest(Request request);
protected abstract XDocument sendRequest(XDocument request);
protected abstract CommonResponse mapResponse(XDocument response);
public CommonResponse process(Request request)
{
return mapResponse(sendRequest(generateRequest(request)));
}
}
我不喜欢的是我们在 XDocument 上操作(所以我们使用 Linq To XML 创建供应商请求)而不是某种代理对象。另一方面,如果我们要在函数中传入和传出这么多完全不同的代理对象,我不确定如何实现模板模式。我知道在某些时候每个请求都可以(甚至在某些情况下必须)由 XML 表示,并且我知道每个供应商的返回都是 XML,因此我决定使用 XDocument 而不是映射的供应商特定表示该 xml 的对象(以及序列化/反序列化)。
尽管如此,我有一种奇怪的感觉,这可以做得更好。
你们中有人过去做过类似的事情吗?你是怎么做的?我会很感激任何指示。