Это сторонние веб-службы, поэтому я не могу контролировать их. Они повторно используют элементы, поэтому структура для многих услуг одинакова, есть только незначительные отличия. Мои данные, которые я отправляю в разные службы, идентичны. Однако службы имеют разные цели и дают мне разные ответы.
Например:
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;
}
Их много, и некоторые из них требуют сотни строк одинакового кода. Сыворотка они обновляют свои услуги, я должен обновить идентичный код во многих разных местах. Я не смог придумать решение, которое требует только однократного повторения идентичных элементов из-за того, что когда дело доходит до добавления их элемента в запрос, для этого требуется элемент с определенным пространством имен из этого запроса.
EDIT: Мы также используем наш объект данных с веб-службами других сторон, поэтому я не могу точно сопоставить имена полей данных с сервисами. (см. ответ 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 работает по соглашению и копирует значение каждого члена исходного объекта члену того же имени в целевом объекте, если он найден.
Таким образом, в вашем примере значение data.IdenticalField будет скопировано в свойServiceElement.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 и отдельных сопоставлений.