Что если я хочу иметь собственную архитектуру плагинов в Grails? - PullRequest
1 голос
/ 23 января 2010

Предположим, я хочу определить интерфейс FooProvider, а затем иметь несколько реализаций этого интерфейса, доступных во время выполнения (возможно, в виде отдельных служб). В моем классе контроллера я хотел бы иметь возможность внедрять все известные реализации этого интерфейса во время выполнения, чтобы я мог представить их как «опции» пользователю для получения различных типов элементов «Foo». Это позволило бы моему серверному коду быть более модульным и позволить нескольким людям определять различные способы подключения сервисов FooProvider.

Из того, что я вижу, Grails только дает мне возможность внедрить единственный экземпляр реализации сервиса в мои классы контроллера / домена. Есть ли способ для Grails внедрить несколько экземпляров службы на основе типа интерфейса? Я предполагаю, что я параллельно с этой возможностью OSGi внедрить реализации интерфейса, доступного в контейнере OSGi ... какие-нибудь идеи?

Ответы [ 2 ]

1 голос
/ 24 января 2010

Что-то вроде того, на что, я думаю, вы нацелены ... Я создал плагин, который поставляет пользовательский артефакт (назовите его Foo ) и предоставляет скрипт, позволяющий разработчику создавать новые экземпляры (MyFoo, YourFoo), и у меня есть шаблон артефакта, расширяющий базовый класс (может реализовать интерфейс). Затем, когда Grails запускается, он находит все артефакты Foo, и в моем FooService у меня есть метод getFooList (), который просто возвращает «application.getFooClasses ()» ... в FooController я получаю этот список и передаю его в пользовательский интерфейс для заполнения выбора список. После того, как пользователь выбирает один по имени, FooService создает его с помощью

    def clazz = ApplicationHolder.application.getFooClass(name)
    myFoo = clazz?.newInstance()

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

1 голос
/ 23 января 2010

Grails использует Spring снизу, поэтому вы можете добавить столько служб в свой контроллер, сколько захотите, если знаете Spring.

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

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

Я бы порекомендовал вам не делать этого, даже если это возможно. Лучшей идеей было бы показать то, что звучит как сложный вариант использования в другом сервисе. Инкапсулируйте это и скройте детали от клиентов. Для этого и нужны объекты - скрывая сложность.

...