0

使用 Guice 时,如何限制客户端从一组特定的类中获取实例(又名Facebook 问题)?

想象一下,我使用端口和适配器来构建我的系统,并且我有一个管理适配器端、一个业务逻辑组件和一个由业务组件使用的数据访问端。如何只允许客户端获取管理适配器端的接口实例?

在代码中:

管理适配器:

public interface Admin { /* ... */ }

class AdminImpl implements Admin {
    @Inject
    AdminImpl(BusLogic bl) { /* .... */ }
    /* ... */
}

业务逻辑:

public interface BusLogic { /* ... */ }

我想让应用程序级别的注入器只返回Admin接口的实例。

谢谢

4

1 回答 1

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);
    }
}
于 2015-02-16T03:18:10.660 回答