我正在尝试在Guice中进行辅助注射。
这是我的实现。
function catch_that_image($my_postid) {
global $post;
$first_img = '';
ob_start();
ob_end_clean();
$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', get_post_field('post_content', $my_postid), $matches);
$first_img = $matches [1] [0];
return $first_img;
}
工厂界面。
public interface Dao<T> {
T get(String id);
}
public class DaoImpl<T> implements Dao<T> {
private final Class<T> clazz;
DaoImpl(@Assisted final Class<T> clazz) {
this.clazz = clazz;
}
@Override
public T get() {
//Some impl code
return T;
}
}
指导模块:
public interface DaoFactory {
<T> Dao<T> getDao(Class<T> clazz);
}
我收到错误消息:“ DaoFactory不能用作键;它没有完全指定”。
我应该如何配置FactoryModuleBuilder?
我的目标是使用DaoFactory在运行时获取Dao的类型化实例
答案 0 :(得分:0)
辅助注入期望有一个绑定来选择要返回的内容-Factory接口的参数必须是所需实现的构造函数中带@Assisted
注释的参数。< / p>
在这种情况下,这意味着为了使DaoFactory.getDao
采取T
,则DaoImpl<T>
的构造函数将需要采用该T
实例(带有注释@Assisted
),然后以某种方式足以使该DaoImpl
实例能够正确构建实例。可能是这样的:
public class DaoImpl<T> implements Dao<T> {
public DaoImpl(@Assisted T instance) {
// Do something with the instance so this Dao is wired up right.
// perhaps with instanceof or instance.getClass()?
}
@Override
public T get() {
//Some impl code
return T;
}
}
所有这些辅助注入都知道该怎么做-可以以某种方式创建运行时查找不是魔术,但这取决于您的用例,这可能就足够了。我不确定为什么DaoFactory.getDao
会接受T
的实例,然后Dao.get()
也会返回T
,但这是示例代码的一部分在这个问题上,我想您已经对此计划了。
编辑后更新:
DaoFactory.getDao
带有一个T
实例,但是DaoImpl
的构造函数是DaoImpl(@Assisted final Class<T> clazz)
-辅助注入工厂必须采用预期传递给构造函数。对于您的问题,这是个好消息-您只需更改工厂声明即可:
public interface DaoFactory {
<T> Dao<T> getDao(Class<T> obj);
}
现在,您以类似getDao
的名称调用MyEntity.class
,并将获得一个Dao<MyEntity>
实例,该实例是由guice内部调用new DaoImpl(MyEntity.class)
创建的。>
如果您希望它特定于某个对象,则调用instance.getClass()
并将其传入将产生一些您应该理解的泛型效果,因为getClass()
实际上返回了一个Class<?>
,或者最好返回Class<? extends WhateverMyDeclaredTypeIs>
。请考虑以下内容:
class MyClass {}
class MySubclass extends MyClass{}
MyClass foo = new MySubclass();
factory.getDao(foo.getClass());// the generics will be a Dao<? extends MyClass>,
// not a Dao<MySubclass>, even though the DaoImpl.clazz holds an instance
// of MySubclass