Сценарий:
(Если кто-нибудь недавно ответил / просмотрел мои вопросы, это будет несколько знакомо)
У меня есть 3 различных веб-сервиса, которые предоставляют набор объектов, имеющих общие черты. Я написал классы-обертки и логику преобразования, используя универсальные методы для переключения между промежуточными объектами и сервисным объектом.
У меня есть интерфейс для веб-службы, пусть он называется IService для целей этого вопроса. У меня есть 3 класса реализации Service1Impl, Service2Impl и Service3Impl. Каждый из них ссылается на отдельный веб-сервис и использует мои вышеупомянутые универсальные методы для преобразования между соответствующими объектами.
Они внедряются в мой класс ServiceWrapper во время выполнения через конструктор (фабрика используется для создания соответствующей реализации ISerivice
Например:
_service = ServiceWrapper.GetServiceWrapper("2");
Даст мне ServiceWrapper, созданный с помощью Service2Impl.
(черт возьми, диаграммы были бы полезны!)
Хорошо, поэтому каждая реализация IService имеет метод, вызываемый для аргументов ради. GetProperties:
public IProperty[] GetProperties(string item, IProperty[] properties)
{
Property[] props = ServiceObjectFactory.CreateProperties<Property>(properties);
Property[] result = _service.GetProperties(item, props);
return ServiceObjectFactory.CreateProperties(result);
}
Это выглядит немного сбивающим с толку (я думаю, что я собираюсь реорганизовать имена).
В основном происходит:
Вызов этой функции из ServiceWrapper осуществляется с промежуточными объектами (IProperty) (как видно из параметров).
Промежуточные объекты преобразуются в объекты недвижимости, относящиеся к конкретной услуге.
Результат возвращается как объект свойства, специфичный для службы.
Результат преобразуется в промежуточные объекты перед передачей обратно в ServiceWrapper.
Теперь этот код будет точно таким же для Service1Impl, Service2Impl и Service3Impl. За исключением, конечно, что используемые типы отличаются.
Может кто-нибудь придумать, как это сделать, чтобы у меня не было одного и того же кода 3 раза?
N.B: Это не верно для каждого метода в каждой реализации. Просто большинство из них.