在C#中使用几个几乎相同的SOAPWeb服务时避免使用相同的代码

  • 本文关键字:SOAPWeb 服务 代码 几个 c# soap
  • 更新时间 :
  • 英文 :


这些是第三方web服务,所以我无法控制它们。它们重用元素,所以很多服务的结构都是相同的,只是略有不同。我发送给不同服务的数据是相同的。然而,这些服务确实有不同的目的,给了我不同的回应。

例如:

    private static service1.IdenticalObject createSomeElement(MyDataObject data)
    {
        service1.IdenticalObject theirServiceElement= new service1.IdenticalObject();
        theirServiceElement.IdenticalField = data.IdenticalField;   
        return theirServiceElement;
    }
    private static service2.IdenticalObject createSomeElement(MyDataObject data)
    {
        service2.IdenticalObject theirServiceElement= new service2.IdenticalObject();
        theirServiceElement.IdenticalField = data.IdenticalField;             
        return theirServiceElement;
    }

其中有很多,其中一些需要数百行相同的代码。当他们更新服务时,我必须在许多不同的位置更新相同的代码。我还没能想出一个只需要实现一次相同元素的解决方案,因为当要将它们的元素添加到请求中时,它需要该请求中具有特定命名空间的元素。

编辑:我们也将我们的数据对象和其他方的web服务一起使用,所以我无法将数据字段的名称和服务的名称具体匹配。(请参阅下面的Automapper答案)

使用AutoMapper可能是您的解决方案。它可以通过NuGet安装。

AutoMapper会将相同的字段从一个对象映射(复制)到另一个对象。

实现可能如下所示:

private static service1.IdenticalObject createSomeElement(MyDataObject data)
{
    service1.IdenticalObject theirServiceElement= new service1.IdenticalObject();
    Mapper.Map(data, theirServiceElement);
    return theirServiceElement;
}
private static service2.IdenticalObject createSomeElement(MyDataObject data)
{
    service2.IdenticalObject theirServiceElement= new service2.IdenticalObject();
    Mapper.Map(data, theirServiceElement);            
    return theirServiceElement;
}

在最简单的配置中,AutoMapper按照约定工作,并将源对象中每个成员的值复制到目标对象中同名的成员(如果找到)。

在你的例子中,数据的价值。IdentialField将被复制到他们的ServiceElement.IdentialField.

如果他们将所有服务中的IdentialField重命名为IdentialItem,那么您只需要在MyDataObject类中进行相同的重命名。同样,如果他们添加了一个新字段,您只需要向MyDataObject添加一个同名字段。

为了使上面的AutoMapper示例正常工作,您还需要添加一些配置来创建MyDataObject和它们的每个IdentialObject类之间的映射。

该配置可能如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using AutoMapper;
namespace YourAppNamespace
{
    public class AutoMapperConfig
    {
        public static void Configure()
        {
            Mapper.CreateMap<MyDataObject, service1.IdenticalObject>();
            Mapper.CreateMap<MyDataObject, service2.IdenticalObject>();
        }
    }
}

来自Global.asax的电话是这样的:

protected void Application_Start()
{
    AutoMapperConfig.Configure();
}

可以创建单元测试来测试AutoMapper配置和各个映射。

最新更新