C# 在C中使用几个几乎相同的SOAP web服务时避免使用相同的代码#
这些是第三方web服务,因此我无法控制它们。 它们重用元素,所以很多服务的结构都是相同的,只是略有不同。我发送到不同服务的数据是相同的。然而,这些服务有不同的目的,给了我不同的回应 例如:C# 在C中使用几个几乎相同的SOAP web服务时避免使用相同的代码#,c#,soap,C#,Soap,这些是第三方web服务,因此我无法控制它们。 它们重用元素,所以很多服务的结构都是相同的,只是略有不同。我发送到不同服务的数据是相同的。然而,这些服务有不同的目的,给了我不同的回应 例如: private static service1.IdenticalObject createSomeElement(MyDataObject data) { service1.IdenticalObject theirServiceElement= new service1.I
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答案)使用可能是您的解决方案。
它可以通过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按照约定工作,并将源对象中每个成员的值复制到目标对象中同名的成员(如果找到)
因此,在您的示例中,data.IdenticalField的值将被复制到其rserviceelement.IdenticalField
如果他们将所有服务中的IdenticalField重命名为IdenticalItem,那么您只需要在MyDataObject类中执行相同的重命名。同样,如果他们添加一个新字段,您只需要向MyDataObject添加一个同名字段
为了让上面的AutoMapper示例正常工作,您还需要添加一些配置来创建MyDataObject和它们的每个IdenticalObject类之间的映射
该配置可能如下所示:
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>();
}
}
}
protected void Application_Start()
{
AutoMapperConfig.Configure();
}
可以创建单元测试来测试AutoMapper配置和各个映射。感谢您的回复。你的回答很适合我问的问题,不幸的是我遗漏了一些关键信息。我们也将我们的数据对象用于来自其他方的web服务,所以我无法具体地将我们的数据字段的名称和服务的名称进行匹配。@DanBrum,AutoMapper有许多高级配置选项,但我不确定它们是否对您的情况有帮助,或者只是将重新工作转移到其他地方。您能否给出一个具体的例子,说明他们对其服务所做的常见类型的更改,以及您对此所做的响应?