如何使用Guice在android中注入的工厂?

时间:2013-02-12 23:19:19

标签: android guice factory

使用Guice注入的工厂时遇到问题。

我读过这篇好文章http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/assistedinject/FactoryModuleBuilder.html,但仍然不明白。即为什么模块从未使用过?与 Guice.createInjector()方法一样。

我尝试了这个简单的应用程序,并且我有 NullPointerException ,因为Guice无法解决我需要的工厂。

public interface FooInterface
{
    String getString();
}

public class Foo implements FooInterface {
    String bar;

    @Inject
    Foo(@Assisted String bar)
    {
        Log.i("main", "Foo constructor");
        this.bar = bar;
    }

    public String getString(){
        Log.i("main", "getString");
        return this.bar;
    }
}

public interface FooFactory
{
    FooInterface create(String bar);
}

这是配置模块

public class ConfigurationModule extends AbstractModule
{
    @Override
    protected void configure()
    {
        Log.i("main", "Configuration module");
        install(new FactoryModuleBuilder().implement(FooInterface.class, Foo.class).build(FooFactory.class));
    }
}

我的活动

public class MyActivity extends Activity implements View.OnClickListener
{
    @Inject private FooFactory fooFactory;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Log.i("main", "onCreate");

        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view)
    {
        Log.i("main", "onClick");
        FooInterface foo = this.fooFactory.create("foo name");
        String str = foo.getString();
        Toast.makeText(getApplicationContext(), "String is: "+ str, Toast.LENGTH_SHORT);
    }
}

正如我从日志中看到的那样,永远不会调用 Foo 构造函数。与 ConfigurationModule 相同。我看不出这个模块的用途。有任何想法吗?也许我错过了什么?

2 个答案:

答案 0 :(得分:1)

从我读过的所有内容开始,我开始认为使用纯Guice for Android应用程序没有任何优势。 Roboguice是正确的选择。

答案 1 :(得分:0)

如果您还需要使用ActionBarSherlock,请查看roboguice-sherlock