Обманывать и ограничивать клиентов получением только определенных экземпляров
При использовании Guice, как ограничить получение клиентами экземпляров из определенной группы классов ( проблема Facebook)?
Представьте, что я проектирую свою систему с использованием портов и адаптеров, и у меня есть сторона адаптера администратора, компонент бизнес-логики и сторона доступа к данным, используемая бизнес-компонентом. Как разрешить клиентам только получать экземпляры интерфейсов на стороне адаптера администратора?
В коде:
Адаптер администратора:
public interface Admin { /* ... */ }
class AdminImpl implements Admin {
@Inject
AdminImpl(BusLogic bl) { /* .... */ }
/* ... */
}
Бизнес логика:
public interface BusLogic { /* ... */ }
Я бы хотел, чтобы инжектор на уровне приложения возвращал только экземпляры Admin
интерфейс.
Спасибо
1 ответ
Решение
Ах, PrivateModule
это один ответ. Один PrivateModule
на уровне приложения, который выставляет только Admin
интерфейс:
public class PrivateModuleTest {
public static interface Admin {}
public static class AdminImpl implements Admin {
@Inject
public AdminImpl(BusLogic x) {}
}
public static interface BusLogic {}
public static class BusLogicImpl implements BusLogic {}
public static class AdminModule extends AbstractModule {
@Override
protected void configure() {
bind(Admin.class).to(AdminImpl.class);
}
}
public static class BusLogicModule extends AbstractModule {
@Override
protected void configure() {
bind(BusLogic.class).to(BusLogicImpl.class);
}
}
public static class AppModule extends PrivateModule {
@Override
protected void configure() {
install(new AdminModule());
expose(Admin.class); // <---- clients may instantiate only this type
install(new BusLogicModule());
}
}
@Test
public void exposeAdmin() {
Guice.createInjector(new AppModule())
.getInstance(Admin.class);
}
@Test(expected = ConfigurationException.class)
public void doNotExposeBusLogic() {
Guice.createInjector(new AppModule())
.getInstance(BusLogic.class);
}
}