Vb.net 统一访问web服务

Vb.net 统一访问web服务,vb.net,web-services,asmx,Vb.net,Web Services,Asmx,我有三个web服务,它们由三个不同的供应商开发,具有不同的URL;输入参数和输出参数。它们都是ASMXWeb服务。它们用于从第三方关系数据库中删除记录,例如,我提供一个personID,一个人从一个系统中被删除,所有与此人相关的内容都被删除。在另一个系统中,我提供一个订单ID,所有链接到订单的内容都将被删除 我有几个选择: 创建一个包装类,负责访问web服务;提供公共输入参数和接受公共输出参数。这个班有很多责任 创建三个包装类,即为每个web服务创建一个包装类 修改Visual Studio生成

我有三个web服务,它们由三个不同的供应商开发,具有不同的URL;输入参数和输出参数。它们都是ASMXWeb服务。它们用于从第三方关系数据库中删除记录,例如,我提供一个personID,一个人从一个系统中被删除,所有与此人相关的内容都被删除。在另一个系统中,我提供一个订单ID,所有链接到订单的内容都将被删除

我有几个选择:

  • 创建一个包装类,负责访问web服务;提供公共输入参数和接受公共输出参数。这个班有很多责任
  • 创建三个包装类,即为每个web服务创建一个包装类
  • 修改Visual Studio生成的代理

  • 哪种方法最好?

    我建议允许Visual Studio自动生成适当的代理类。然后,我将为每个web服务实现一个包装器类,以便所有包装器类都可以实现相同的接口。例如,您可以创建一个如下所示的公共接口:

    Public Interface IPersonBusiness
        Sub DeletePerson(personId As String)
    End Interface
    
    Public Class WebService1Wrapper
        Implements IPersonBusiness
    
        Public Sub New(proxy As WebService1)
            _proxy = proxy
        End Sub
    
        Private _proxy As WebService1
    
        Public Sub DeletePerson(personId As String) Implements IPersonBusiness.DeletePerson
            _proxy.Delete(personId, Date.Now)
        End Sub
    End Class
    
    Public Class WebService2Wrapper
        Implements IPersonBusiness
    
        Public Sub New(proxy As WebService2)
            _proxy = proxy
        End Sub
    
        Private _proxy As WebService2
    
        Public Sub DeletePerson(personId As String) Implements IPersonBusiness.DeletePerson
            _proxy.DeletePeople({personId})
        End Sub
    End Classs
    
    然后,假设您有两个web服务。第一个,我们将其称为
    WebService1
    ,它有一个
    Delete
    方法,该方法获取一个personid,后跟删除时间。第二个web服务,我们称之为
    WebService2
    ,它有一个
    DeletePeople
    方法,该方法接受一组人员ID。我们可以使用上述通用接口包装这两个web服务,如下所示:

    Public Interface IPersonBusiness
        Sub DeletePerson(personId As String)
    End Interface
    
    Public Class WebService1Wrapper
        Implements IPersonBusiness
    
        Public Sub New(proxy As WebService1)
            _proxy = proxy
        End Sub
    
        Private _proxy As WebService1
    
        Public Sub DeletePerson(personId As String) Implements IPersonBusiness.DeletePerson
            _proxy.Delete(personId, Date.Now)
        End Sub
    End Class
    
    Public Class WebService2Wrapper
        Implements IPersonBusiness
    
        Public Sub New(proxy As WebService2)
            _proxy = proxy
        End Sub
    
        Private _proxy As WebService2
    
        Public Sub DeletePerson(personId As String) Implements IPersonBusiness.DeletePerson
            _proxy.DeletePeople({personId})
        End Sub
    End Classs
    
    我会避免编写您自己的代理代码,除非您真的需要。例如,如果您需要根据一些外部设置动态调用任何web服务,这些设置告诉您要传递的方法名称和参数,或者类似的内容,那么这将是值得研究的


    我还避免将调用任何web服务的所有逻辑放在单个包装器类中。这样做会使代码变得不必要的丑陋和混乱,特别是在将来需要添加额外的web服务时。

    这三种web服务都可以互换吗?换句话说,您的应用程序是否本质上使用它们来执行相同的任务?您是否打算使用这些web服务中的任何一个作为后端,使应用程序能够同样出色地工作?听起来您希望它们可以互换,就像您在代码中访问它们一样,但听起来它们的用途不同。如果一个删除了人,而另一个删除了订单,你为什么要把他们当作同一件事来对待呢?@Steven Doggart,我以人和订单为例。实际的问题领域不是人和命令。我的任务是从大量数据库中删除个人信息(20)。我正在尝试创建可以重用的代码。你是在推荐方案3吗?我现在有一个想法,这是你所说的一个变体+1.我明天会回来,如果有帮助的话,把这个标记为已回答。谢谢