2009-08-11 7 views
2

Мне было поручено преобразовать приложение, которое было разработано мною в Waffle Framework с использованием PicoContainer как механизма DI в наш новый «стек», который должен использовать Struts2 в качестве основы с Guice как механизм DI. Есть ли у кого-нибудь какие-либо полезные указания относительно того, как это сделать с минимальной болью и в то же время получить максимум от новой структуры и механизма DI?Преобразование из Waffle/Pico в Struts2/Guice

Большое спасибо заранее.

ответ

3

Правильно, я понимаю, что вопрос был немного расплывчатым, но в конце концов я сделал это. Механизм Waffle/Pico для DI использует класс, называемый регистратором, для настройки классов, которые вы хотите ввести, и их сферы действия в webapp. Пример на их сайте:

public class MyRegistrar extends AbstractRegistrar { 

    public MyRegistrar(Registrar delegate) { 
    super(delegate); 
    } 

    public void application() { 
    register("helloworld", HelloWorldController.class); 
    } 
} 

Этот пример показывает класс приложения в области видимости - для сеанса и запроса областей, вы просто поместите их в соответствующие session() или request() методов.

С Struts2 и Guice вещи структурированы несколько иначе. Сначала принимая Guice, он вводит зависимости, используя аннотацию @Inject над конструктором. Конфигурация впрыска выполняется через классы Modules, которые должны переопределять метод, называемый configure(), для привязки интерфейсов к их классам. Пример Google приведен ниже.

public class BillingModule extends AbstractModule { 
    @Override 
    protected void configure() { 
    bind(TransactionLog.class).to(DatabaseTransactionLog.class); 
    bind(CreditCardProcessor.class).to(PaypalCreditCardProcessor.class); 
    bind(BillingService.class).to(RealBillingService.class); 
    } 
} 

В этих модулях также определяется область охвата. Одноплодной эффективно применение в области видимости класса и могут быть определены следующим образом:

bind(TransactionLog.class).to(InMemoryTransactionLog.class).in(Singleton.class); 

Но Guice также SessionScoped.class и RequestScoped.class поэтому переход довольно тривиально.

Что касается Struts2, инъекции зависимостей используется там было на самом деле ранняя версия о том, что в конечном итоге стал Guice, поэтому становится вопрос о том, добавив следующую строку в struts.xml

<constant name="struts.objectFactory" value="guice" /> 

И указав StrutsPrepareAndExecuteFilter в web.xml

<filter>   
    <filter-name>struts2</filter-name> 
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> 
</filter>  
<filter-mapping> 
    <filter-name>struts2</filter-name> 
    <url-pattern>/* </url-pattern> 
</filter-mapping> 

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