这些是第三方网络服务,所以我无法控制它们。 他们重用元素,因此很多服务的结构都是一样的,只有细微的差别。我发送给不同服务的数据是相同的。但是,服务确实有不同的用途,并给我不同的回应。
例如:
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;
}
这些中有很多,其中一些需要数百行相同的代码。当他们更新他们的服务时,我必须在许多不同的位置更新相同的代码。我无法想出一个只需要实现相同元素一次的解决方案,因为当它将它们的元素添加到请求中时,它需要具有来自该请求的特定命名空间的元素。 / p>
编辑:我们也将数据对象与来自其他方的Web服务一起使用,因此我无法将我们的数据字段的名称与服务的名称特别匹配。 (参见下面的Automapper答案)
答案 0 :(得分:1)
使用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的值将被复制到其ServicesElement.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>();
}
}
}
从Global.asax这样调用:
protected void Application_Start()
{
AutoMapperConfig.Configure();
}
可以创建单元测试来测试AutoMapper配置和各个映射。