Избегание идентичного кода при использовании нескольких почти идентичных веб-сервисов SOAP в C #

1

Это сторонние веб-службы, поэтому я не могу контролировать их. Они повторно используют элементы, поэтому структура для многих услуг одинакова, есть только незначительные отличия. Мои данные, которые я отправляю в разные службы, идентичны. Однако службы имеют разные цели и дают мне разные ответы.

Например:

    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 ниже)

Теги:
soap

1 ответ

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 будет скопировано в свой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 и отдельных сопоставлений.

  • 0
    Спасибо за ответ. Ваш ответ хорош для вопроса, который я задал, к сожалению, я оставил некоторую ключевую информацию. Мы также используем наш объект данных с веб-службами других сторон, поэтому я не могу специально сопоставить имена полей наших данных с именами службы.
  • 0
    @DanBrum, AutoMapper имеет ряд дополнительных параметров конфигурации, но я не уверен, помогут ли они в вашем случае или просто перенесут переделку в другое место. Не могли бы вы привести конкретный пример типичного изменения, которое они вносят в свои услуги, и что вы должны сделать в ответ на это?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню