java - 引导并限制客户端仅获取某些实例

标签 java guice hexagonal-architecture

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

想象一下我使用 ports-and-adapters 构建我的系统我有一个管理适配器端、一个业务逻辑组件和一个由业务组件使用的数据访问端。如何允许客户端仅获取管理适配器端的接口(interface)实例?

在代码中:

管理适配器:

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

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

业务逻辑:

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

我想让应用程序级别的注入(inject)器仅返回Admin接口(interface)的实例。

谢谢

最佳答案

啊,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);
    }
}

关于java - 引导并限制客户端仅获取某些实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28532658/

相关文章:

java - 一个物体或多个物体上的多个固定装置?

java - Guice 可以从类文字实例化我的类吗?

java - 构建和注入(inject)客户端

java - 使用 Cucumber 进行回归组件测试。应该测试的层是否有边界?

architecture - 洋葱结构与六边形相比

java - org.springframework.mail.MailAuthenticationException : Authentication failed; nested exception is javax. mail.AuthenticationFailedException:;

java - 如何指定 jackson 只使用字段 - 最好是全局

java - Apache CXF 依赖项

java - 为什么 Guice 为我的单例创建一个新实例?

ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器