2009-04-19 12 views
12

Я проверяю Google Guice as DI framework, но я немного озадачен: почему нет файла конфигурации вообще?Почему нет файла конфигурации для инъекций зависимостей с помощью Google Guice?

Я нашел частичное объяснение на this question, но до сих пор неясно, как я смогу установить свои роли компонента (или любую другую вещь, которую я должен использовать для переключения) без файла конфигурации.

Любая помощь оценена!

ответ

28

Конфигурация находится в коде вместо файлов конфигурации, что является допустимым решением для многих сценариев.

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

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

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

4

Большая конфигурация в Guice неявная, через @Inject Annotation. Большая сложность проектов связана с большим количеством проектов Artifacts. Файлы Java, файлы Xml, файлы свойств, базы данных, параметры. Guice пытается удалить часть этой сложности, не используя файлы конфигурации.

Повторное подключение вашего приложения легко во время компиляции. Скорее всего, вам нужно будет только отредактировать класс модуля. Для большинства классов, созданных Guice, вам не потребуется никакой конфигурации, но только @Inject в правильных местах - вам нужно будет всего лишь настроить что-либо, когда у вас есть две разные реализации одного и того же интерфейса - или когда вы хотите вводить классы из внешние библиотеки с использованием классов поставщиков.

5

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

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

1

Не знаете, что вы хотите сказать по файлу, но Guice позволяет вам изменять реализации через Binder и пользовательские Providers.

+1

Да, я имею в виду, что единственный способ изменить поведение - это перестроить всю вещь. – JohnIdol

7

Тривиально вводить форматирование с использованием файлов конфигурации, если вы так склонны. Мы используем Guice вместе с простым API, который загружает файлы свойств, где все происходит, которые действительно нужно параметризовать. Это можно использовать вместе с аннотациями @Named и т. Д., И, конечно, вы можете иметь некоторые условные обозначения в модулях (хотя это хорошая идея не переделывать это).

Это пример того, как часть нашей самозагрузки устанавливаются:

public class MetModules extends AbstractModule { 

    private static final Logger log = LoggerFactory.getLogger(MetModules.class); 

    private final Settings settings; 

    public MetModules(Settings settings) { 
     this.settings = settings; 
    } 

    @Override 
    protected void configure() { 

     // common (stage independent modules) go here 
     install(new CommandsModule()); 
     install(new ServletsModule()); 
     install(new DataBaseModule(settings)); 
     install(new JobsModule(settings)); 

     // any development/ production specific modules 
     Stage stage = currentStage(); 
     if (Stage.DEVELOPMENT.equals(stage)) { 
      configureForDevelopment(); 
     } else { // PRODUCTION 
      configureForProduction(); 
     } 
    } 

    /** 
    * Install modules that will be used in development. 
    */ 
    private void configureForDevelopment() { 

     // Mock implementation of email delivery that just logs it got a 
     // message rather than trying to send it. 
     install(new AbstractModule() { 
      @Override 
      protected void configure() { 
       bind(Delivery.class).toInstance(new Delivery() { 

        public String deliver(MailMessageExchange exchange) 
          throws DeliveryException { 
         log.info("email message: " 
           + exchange.getMessage().getMailMessage() 
           + " to " 
           + Arrays.asList(exchange.getMessage() 
             .getMailMessage().getTo()) 
           + " (not sent)"); 
         return "fooMessageId"; 
        } 
       }); 
      } 
     }); 

     // local in-memory registry suffices 
     install(new LocalServiceRegistryModule()); 

     // local in memory db implementations of services 
     install(new LocalServicesModule()); 
    } 

    /** 
    * Install modules that will be used in production. 
    */ 
    private void configureForProduction() { 
     // we really only need this (error interception and audit logging) 
     // in production 
     install(new AopModule()); 
     install(new ZooKeeperServiceRegistryModule());  } 
} 

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

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

  • Нет связанных вопросов^_^