引导和限制客户只获取某些实例
Guice and restricting clients to getting only certain instances
使用 Guice 时,如何限制客户端从特定组 类(又名 the Facebook problem)获取实例?
假设我使用 ports-and-adapters 构建我的系统,并且我有一个管理适配器端、一个业务逻辑组件和一个由业务组件使用的数据访问端。如何让客户端只获取admin adapter端接口的实例?
在代码中:
管理员适配器:
public interface Admin { /* ... */ }
class AdminImpl implements Admin {
@Inject
AdminImpl(BusLogic bl) { /* .... */ }
/* ... */
}
业务逻辑:
public interface BusLogic { /* ... */ }
我只想在应用程序级别制作注入器 return Admin
接口的实例。
谢谢
啊,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);
}
}
使用 Guice 时,如何限制客户端从特定组 类(又名 the Facebook problem)获取实例?
假设我使用 ports-and-adapters 构建我的系统,并且我有一个管理适配器端、一个业务逻辑组件和一个由业务组件使用的数据访问端。如何让客户端只获取admin adapter端接口的实例?
在代码中:
管理员适配器:
public interface Admin { /* ... */ }
class AdminImpl implements Admin {
@Inject
AdminImpl(BusLogic bl) { /* .... */ }
/* ... */
}
业务逻辑:
public interface BusLogic { /* ... */ }
我只想在应用程序级别制作注入器 return Admin
接口的实例。
谢谢
啊,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);
}
}