【问题标题】:Guice and restricting clients to getting only certain instancesGuice 并限制客户端仅获取某些实例
【发布时间】:2015-02-15 23:51:24
【问题描述】:

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

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

在代码中:

管理适配器:

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

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

业务逻辑:

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

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

谢谢

【问题讨论】:

    标签: java guice hexagonal-architecture


    【解决方案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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 2019-05-24
      • 1970-01-01
      • 2021-01-17
      • 2013-02-23
      相关资源
      最近更新 更多