适当的供应商整合方法

时间:2013-08-28 07:50:47

标签: c# xml design-patterns linq-to-xml integration

在我正在工作的项目中,我们通过他们的网络服务从40多个不同的供应商中提取一些数据,然后将它们汇总在一起,然后再向客户展示。
每个供应商提供不同类型的服务(我们发送的一些请求是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的供应商特定对象(以及序列化/反序列化) 不过我有一种奇怪的感觉,这可以做得更好 你们有没有做过类似的事情?你是怎么做到的?我会很高兴任何指针。

2 个答案:

答案 0 :(得分:1)

你不能用泛型并使用代理对象吗?

之类的东西
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
        }
    }

答案 1 :(得分:0)

我正在开展一个类似的项目。这听起来与你正在做的非常相似。

由于我需要供应商响应的历史记录,因此我让各个供应商类将响应写入数据库(在解析响应的相关部分之后),然后从主线程访问它。