供应商整合的适当方法
本文关键字:方法 供应商 | 更新日期: 2023-09-27 18:29:21
在我现在工作的项目中,我们通过40多个不同的供应商的web服务从他们那里提取一些数据,然后在向客户展示之前将它们聚合在一起
每个供应商都提供不同类型的服务(我们发送的一些请求是SOAP调用,一些是通过POST或GET的简单查询字符串,还有其他…)。
目前系统有点混乱,我们有一个基类,它有一个名为GetSupplierData(请求请求)的抽象方法,每个供应商类都会覆盖该方法。问题是,每个供应商类在该方法中做完全不同的事情,在请求的不同部分设置超时等。我的任务是在所有供应商中实现一个通用的业务逻辑/定时/日志记录,所以我认为应该改变这种方法
根据业务逻辑,整个流程可以分为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的映射供应商特定对象(以及序列化/反序列化)
尽管如此,我还是有一种奇怪的感觉,这本可以做得更好
你们中有人过去做过类似的事情吗?你是怎么做的?我会非常擅长任何指点。
难道不能使用泛型并使用代理对象吗?类似的东西
public abstract class SupplierBase<TRequest, TResponse>
{
protected abstract TRequest generateRequest();
protected abstract TResponse sendRequest (TRequest request);
protected abstract CommonResponse mapResponse (TResponse request);
public CommonResponse process(TRequest request)
{
return mapResponse(sendRequest(generateRequest()));
}
}
// an implementing class...
public class SupplierA:SupplierBase<RequestA, ResponseA>
{
protected override RequestA generateRequest()
{
return new RequestA();
}
protected override ResponseA sendRequest(RequestA request)
{
// call with the request and return the specific response
}
protected override CommonResponse mapResponse(ResponseA request)
{
// map the specific response to the common response
}
}
我正在做一个类似的项目。这听起来和你正在做的很相似。
由于我需要供应商响应的历史记录,我让各个供应商类将响应写入数据库(在解析响应的相关部分之后),然后从主线程访问它。