Разработка интерфейса запуска сервиса - PullRequest
0 голосов
/ 21 января 2011

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

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

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

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

Ответы [ 4 ]

1 голос
/ 31 января 2011

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

0 голосов
/ 21 июля 2011

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

    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);
}

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

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

0 голосов
/ 21 января 2011

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

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

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

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

и т. д.

0 голосов
/ 21 января 2011

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

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