有人能建议一个依赖于与第三方服务集成的应用程序的设计模式或基本架构吗?

本文关键字:设计模式 应用程序 集成 服务 第三方 依赖于 一个 | 更新日期: 2023-09-27 18:18:01

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

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

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

我猜这在专门提供数据的企业中是一个相当普遍的问题,所以我想知道是否有一个通用的方法来解决它?

有人能建议一个依赖于与第三方服务集成的应用程序的设计模式或基本架构吗?

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

听起来你已经知道其中的一些了。如果您正在做某种"配置"方法,听起来像是您想要的,那么请求层将类似于输出配置。也就是说,如果你考虑许多报告引擎,你可以选择HTML、CSV、Excel、Interactive等输出。如果您的新第三方对XML数据使用与之前相同的约定,但可能略有不同的数据结构或不同的数据,那么您可以重用相同的请求"类别"/RequestType或任何您想要称呼它的名称。我个人称这些为requesttype。因此,即使您必须为该请求类型编写代码和类,希望如果设计良好,它可以被重用。每个RequestType类都应该被设计成可重用的,比如实现一个公共基类或接口,以便在它之前调用它的层可以很容易地通用地这样做。

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

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

我会避免尝试一般化像数据映射和传输这样复杂的东西。最终,您的代码将比简单地这样做更难理解:

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);
}

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