Обманывать и ограничивать клиентов получением только определенных экземпляров

При использовании 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);
    }
}
Другие вопросы по тегам