2011-01-20 2 views
0

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

interface Service { 
    void start(); 
    OperationResult operation(parameters); 
    ... 
} 

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

Как бы вы решили эту проблему? У меня есть простое решение, которое имеет одно основное ограничение без загрязнения интерфейса службы, поэтому я хотел бы услышать предложения людей.

ответ

1

Если необходимо запустить службу, а затем делать вещи с ним, а затем, возможно, прекратить службу, должен быть объект, функция которого просто запустить службу и поставить объект, который может затем можно использовать для работы с сервисом, включая его прекращение (последнее действие - возможно, лучше всего обрабатывается через IDisposable - должно аннулировать объект «do-stuff»).

0

Несколько способов:

  • запустить его, когда он получает построен
  • сгенерирует исключение из методов работы, если служба не запущена, что указывает неправильное использование
  • автоматически запустить его из любого метода, если он не запущен
+0

Итак, каков ваш ответ? Вы выбрали три разные стратегии, которые несовместимы и почему? –

+0

@ mP это зависит от вас, чтобы выбрать один, потому что вы видите всю картину. У меня есть только ограниченная информация, которую вы предоставили. – Bozho

0

Ваш вопрос возникает из-за того, что вы смешиваете проблемы реализации (метод start(), например) с помощью действия (метод operation()). Запуск - это проблема с реализацией, потому что вы можете создать экземпляр для каждого вызывающего, или у вас может быть одноэлемент (как в кешированных экземплярах). Вызывающему не нужно будет вызывать метод вообще. Фактически, если вы сохраните метод старта и измените свою реализацию на один сингл завтра, код может перестать работать для существующих клиентов.

IMO, вы должны избавиться от метода start из этого интерфейса и позволить вызывающему абоненту беспокоиться о делегировании задачи, которую лучше всего использует ваш метод работы.

Если вы примените метод старта (шаг оптимизации, который не имеет никакого отношения к интерфейсу) к вашей реализации, вы можете решить проблему любым способом. Например,

a. call start(), если он еще не был вызван в метод operation(). Вам понадобятся проблемы с синхронизацией. b. вызовите start() в конструкторе объекта реализации и сделайте с ним.

и т.д.

+0

Является ли тот факт, что запуск не может быть отсрочен проблемой? –

+0

@mP Если метод запуска не может быть отложен, вы можете быть жадным и уволить его в своем конструкторе или создать некоторую стратегию, которая является ленивой и все же срабатывает в какой-то момент между инициализацией и использованием метода. Все зависит от того, как и когда вы будете запускать запуск. – guidothekp

0

Если вы не хотите, чтобы потребитель заботился о вызове запуска. Вы можете рассмотреть возможность делегирования вашего кода запуска внутри защищенного метода, который ленив инициализирует то, что вы сейчас делаете при запуске. Такие, как:

protected MyService getMyService() { 
    if(myService == null) { 
     myService = new MyServiceImpl(); 
     myService.startup(); 
    } 
    return idpPersistence; 
} 

методы вызова, как это:

public String findByThis(String tag, String key) { 
    return getMyService().findThat(MyClass.class, column, key); 
} 

Это, конечно, имеет некоторые компромиссы. Если вы пользуетесь услугами при запуске, это значит, что первый вызывающий абонент получит первый удар.

Другой вариант - реализовать их с помощью статического блока {}, но это, конечно, иногда также не очень легко проверить.Кроме того, вы выполняете свои процедуры запуска при создании объекта, что иногда также нарушает модели МОК. Я пошел с добавлением интерфейса службы, потому что у меня были внутренние клиенты, и я хотел, чтобы все службы были инициализированы и готовы при запуске.

+0

спасибо за ответ, но какую стратегию вы бы выбрали. Что в общем смысле лучше всего в большинстве случаев. –

Смежные вопросы