C # Generics / Design Patterns: должен ли я использовать шаблонный метод? - PullRequest
1 голос
/ 21 октября 2008

Сценарий:

(Если кто-нибудь недавно ответил / просмотрел мои вопросы, это будет несколько знакомо)

У меня есть 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);
}

Это выглядит немного сбивающим с толку (я думаю, что я собираюсь реорганизовать имена).

В основном происходит:

  1. Вызов этой функции из ServiceWrapper осуществляется с промежуточными объектами (IProperty) (как видно из параметров).

  2. Промежуточные объекты преобразуются в объекты недвижимости, относящиеся к конкретной услуге.

  3. Результат возвращается как объект свойства, специфичный для службы.

  4. Результат преобразуется в промежуточные объекты перед передачей обратно в ServiceWrapper.

Теперь этот код будет точно таким же для Service1Impl, Service2Impl и Service3Impl. За исключением, конечно, что используемые типы отличаются.

Может кто-нибудь придумать, как это сделать, чтобы у меня не было одного и того же кода 3 раза?

N.B: Это не верно для каждого метода в каждой реализации. Просто большинство из них.

Ответы [ 2 ]

1 голос
/ 21 октября 2008

В общем, я думаю, что если вы хотите, чтобы ваш код имел разные сигнатуры типов, вам придется писать код три раза. Поскольку типы различны, это вовсе не «один и тот же код».

Вы можете поместить то, что у вас есть, в унаследованный метод, а затем обернуть результаты в каждом подклассе.

0 голосов
/ 21 октября 2008

Я не уверен, соответствует ли это вашему сценарию, но чтение вашего вопроса Обращение контроля приходит мне на ум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...