标准对象工厂可能如下所示:
interface I { ... }
class A implements I { ... }
class B implements I { ... }
class IFactory {
I getI(int i) {
switch (i) {
case 1: return new A();
default: return new B();
}
}
}
是否可以设置绑定以便为我完成切换,即我所做的只是调用 getInstance 或注入?我正在研究辅助注射,但这似乎是不同的主题:https://code.google.com/p/google-guice/wiki/AssistedInject
听起来您正在寻找一个< code>MapBinder,它是多绑定功能的一部分。请注意,您仍然需要放入某种类型的< code>IFactory或其他工厂接口,因为< code>getInstance不像< code>getI那样接受参数,并且您仍然需要在某处建立从整数到类实现的映射。
class IModule extends AbstractModule {
@Override public void configure() {
MapBinder<Integer, I> myBinder =
MapBinder.newMapBinder(binder(), Integer.class, I.class);
myBinder.addBinding(1).to(A.class);
// Add more here.
}
}
// You can even split the MapBinding across Modules, if you'd like.
class SomeOtherModule extends AbstractModule {
@Override public void configure() {
// MapBinder.newMapBinder does not complain about duplicate bindings
// as long as the keys are different.
MapBinder<Integer, I> myBinder =
MapBinder.newMapBinder(binder(), Integer.class, I.class);
myBinder.addBinding(3).to(C.class);
myBinder.addBinding(4).to(D.class);
}
}
配置了这些模块的喷油器将提供可注射的地图
对于不会创建太多浪费实例的更好选择,请注入
Map
class YourConsumer {
@Inject Map<Integer, Provider<I>> iMap;
public void yourMethod(int iIndex) {
// get an I implementor
I i = iMap.get(iIndex).get();
// ...
}
}
但是,要以您的方式提供“默认”实现(和不透明接口),您需要在
MapBinder
映射之上实现自己的短包装器:
class IFactory {
@Inject Map<Integer, Provider<I>> iMap;
@Inject Provider<B> defaultI; // Bound automatically for every Guice key
I getI(int i) {
return iMap.containsKey(i) ? iMap.get(i).get() : defaultI.get();
}
}
。(您也可以像我在这里一样使用< code>ImmutableMap。如果以上内容看起来有些多余,请记住,您可以注入一个< code >注入器
并创建一个从键到实现的本地< code >映射
class IFactory {
@Inject Injector injector; // This is a bad idea, except for times like this
@Inject Provider<B> defaultI;
static final ImmutableMap<Integer, Class<? extends I>> map = ImmutableMap.of(
1, A.class,
3, C.class,
4, D.class);
I getI(int i) {
return map.containsKey(i)
? injector.getInstance(map.get(i))
: defaultI.get();
}
}
问题内容: 标准对象工厂可能如下所示: 是否可以设置绑定以便为我完成切换,即我要做的就是调用getInstance或inject?我当时在看辅助注射,但这似乎是另外一个话题:https : //code.google.com/p/google- guice/wiki/AssistedInject 问题答案: 听起来您正在寻找,这是多重绑定功能的一部分。请注意,您仍然需要放入某种工厂接口或其他工厂接
本文向大家介绍C#实现根据实体类自动创建数据库表,包括了C#实现根据实体类自动创建数据库表的使用技巧和注意事项,需要的朋友参考一下 .Net新手通常容易把属性(Property)跟特性(Attribute)搞混,其实这是两种不同的东西 属性指的类中封装的数据字段;而特性是对类、字段、方法和属性等元素标注的声明性信息 如下代码(Id、Name为User的属性,[DbKey]为Id的特性) 特性分预定
对不起,如果这是一个微不足道的问题,我是新的指南。假设我有下面这个类: 然后在其他地方我想做: 我希望有两个“MyClass”实例,一个名为“foo ”,一个名为“bar ”(也就是说,它们中的每一个都有一个不同的依赖实例)。我如何将这两个实例添加到我的注入器中,如何用“injector.getInstance”检索它们中的每一个? 我不想为每个可能的依赖项创建一个“MyClass”的子类。 谢谢
有什么方法可以为我创建的类使用自动装箱吗?例如,我有的子类。 现在,< code > UnsignedInteger I = new UnsignedInteger(88);工作得非常好,但是有什么方法可以让这个编译:< code > UnsignedInteger i = 88?对我来说不会。提前感谢!
我们已经使用Google Guice框架进行依赖注入。我需要在Java创建一个接口的多个insatnce。 执行从这里开始:下面代码中的KFHRecordValidator.java类: process类具有RecordValidationHelper类的引用,并且注入是通过构造函数进行的。iRecordValidationService.java是一个具有validate方法的接口。 类处理器有
问题内容: 有时,我创建一个装饰器类,如下所示: IntelliJ可以自动为我创建此类吗? 问题答案: 更新// 我注意到IntelliJ具有用于生成委托方法的“生成”选项。创建一个新类: 然后标记myInterface,转到“菜单”>“代码”>“委托方法”,选择要包装的所有方法,仅此而已。 //更新结束 您可以尝试“重构”->“用委派替换继承”重构。这样就应该能够做到。我称之为“使用Alt +