2014-11-28 5 views
0

Вот мои классы:Guice: связывающий Неоперативный зависимости

public interface MyService { 
    // ... 
} 

public class MyServiceImpl implements MyService { 
    private MyCommand myCommand; 
} 

public interface MyCommand { 
    // ... 
} 

public class MyCommandImpl implements MyCommand { 
    private MyDAO myDAO; 
} 

public interface MyDAO { 
    // ... 
} 

public class MyDAOImpl implements MyDAO { 
    // ... 
} 

public class MyModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(MyService.class).to(MyServiceImpl.class) 
    } 
} 

public class MyDriver { 
    @Inject 
    private MyService myService; 

    public static void main(String[] args) { 
     MyModule module = new MyModule(); 
     Injector injector = Guice.createInjector(module); 
     MyDriver myDriver = injector.getInstance(MyDriver.class); 

     // Should have been injected with a MyServiceImpl, 
     // Which should have been injected with a MyCommandImpl, 
     // Which should have been injected with a MyDAOImpl. 
     myDriver.getMyService().doSomething(); 
    } 
} 

Так что это берет на себя инъекционные запросы на MyService с с экземплярами MyServiceImpl. Но я не могу понять, как рассказать Guice о настройке MyServiceImpl s с MyCommandImpl и как связать MyCommandImpl s с MyDAOImpl s.

ответ

3

Другие крепления и инъекции, которые вам нужны, должны быть настроены так же, как и первый. Используйте @Inject везде, где требуется экземпляр, и bind интерфейс к имплантату в вашем модуле. Я добавил 4 строки ниже (аннотированные 2 места для инъекций и определены еще 2 привязки):

public interface MyService { 
    // ... 
} 

public class MyServiceImpl implements MyService { 
    @Inject 
    private MyCommand myCommand; 
} 

public interface MyCommand { 
    // ... 
} 

public class MyCommandImpl implements MyCommand { 
    @Inject 
    private MyDAO myDAO; 
} 

public interface MyDAO { 
    // ... 
} 

public class MyDAOImpl implements MyDAO { 
    // ... 
} 

public class MyModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(MyService.class).to(MyServiceImpl.class); 
     bind(MyCommand.class).to(MyCommandImpl.class); 
     bind(MyDAO.class).to(MyDAOImpl.class); 
    } 
} 

public class MyDriver { 
    @Inject 
    private MyService myService; 

    public static void main(String[] args) { 
     MyModule module = new MyModule(); 
     Injector injector = Guice.createInjector(module); 
     MyDriver myDriver = injector.getInstance(MyDriver.class); 

     // Should have been injected with a MyServiceImpl, 
     // Which should have been injected with a MyCommandImpl, 
     // Which should have been injected with a MyDAOImpl. 
     myDriver.getMyService().doSomething(); 
    } 
} 
Смежные вопросы