2

好的,所以我的业务不断与各种第 3 方达成交易以向其发送数据。这些第 3 方中的每一个都有不同的集成技术,例如,有些将只接受带有查询字符串数据的 HTTP GET。其他人将采用 XML 表单发布,而有些人则要求我们使用 WCF 服务。

我们向每个第 3 方发布相同的数据,唯一的主要区别是不同的字段名称映射,例如,有些可能使用“ApplicationID”,而另一些可能使用“AppRef”等。

我试图想出一种方法来构建我的应用程序,以允许某人与第三方动态集成而无需编写新代码。映射可以通过数据库中的映射表等方式来处理,但我最大的问题是考虑一种与各种 3rd 方服务集成的方法,主要是 wcf。

我猜这在专门从事数据提供的企业中是一个很常见的问题,所以我想知道是否有一种通用的方法来解决它?

4

2 回答 2

2

我将拥有(并且已经拥有)一个构建通用数据结构的层(可能从您的数据库中检索一些数据以创建结构),一个数据映射层,将其转换为具有与第三方结构一致的属性名称的结构,以及组成请求的请求层。

听起来你已经弄清楚了其中的一些。如果您正在执行某种听起来像您想要的“配置”方法,那么请求层就像一个输出配置。即,如果您考虑许多报告引擎,您可以选择 HTML、CSV、Excel、Interactive 等输出。如果您的新第 3 方对 XML 数据使用与前一个相同的约定,但数据结构或数据可能略有不同,那么您可以重用相同的请求“类别”/RequestType 或您想要调用的任何内容。我个人称这些 RequestTypes。因此,即使您必须为该请求类型编写代码和类,但如果设计得当,希望它可以被重用。每个 RequestType 类都应该设计成可重用的,

一种工厂模式,允许您调用类似的东西GetRequestType( database.SomeThirdParty.RequestTypeEnumValue ),它接受一个指示 RequestType 的枚举或字符串并返回一个类。由于该类应该实现一些通用接口/基类,它可以继续传递数据结构并调用诸如 SendRequest() 之类的东西,而不必知道它正在使用哪个请求类型类。

这样做的好处是,当您遇到第 3 方的实现完全不称职的情况时,您必须为他们编写特殊代码,然后您可以为他们创建一个新的 RequestType 类。创建一个完全通过配置允许 3rd 方集成并可以处理所有可能场景的系统将是一项具有挑战性的任务。当我看到系统如此复杂以至于它们允许像这样完全无代码的实现时,你最终会得到一些非常复杂的东西。再次以报表引擎类比为例,我在报表中看到了一些非常复杂的东西,而这些东西在代码中会更直接。是的,报告引擎足够“复杂”,可以让别人去做,但代价是什么?

于 2013-06-12T18:53:03.143 回答
1

我会避免试图概括像数据映射和传输这样复杂的东西。最终,您的代码将比您仅仅拥有以下代码更难理解:

public interface IDataExportTarget
{
    async Task ExportDataAsync(YourDataType data);
}

不仅数据传输机制可能不同(WCF、RESTful 接口等),而且您的数据格式也可能不同(CSV、XML、JSON 等),以及您在传输数据时如何打包数据。当然,如果您有共同的导出问题,您可以有共同的抽象基类:

public abstract class XmlDataExportTarget : IDataExportTarget
{
    public async Task ExportData(YourDataType data)
    {
        var xml = MapDataToXml(data);
        await SendXmlDataAsync(xml);
    }

    protected abstract XDocument MapDataToXml(YourDataType data);
    protected abstract async Task SendXmlDataAsync(XDocument data);
}

...但是只有在发现代码导致您重复自己时,您才应该这样做。

于 2013-06-12T19:01:16.563 回答