2011-12-12 47 views
0

这可能是我的问题的一部分。RoboGuice的哪个版本适用于Android SDK 8?

基本上我正在为版本1.1.2的实际注入而苦苦挣扎。我已经阅读了该网站上的几页,我觉得我错过了一些东西。

基本上我已经完成了RoboApplication扩展。我重写了addApplicationModules方法。我甚至制作了一个模块。

我的模块如下所示:

public class DataRepository extends AbstractAndroidModule 
    { 

     @Override 
     protected void configure() { 
      /* 
       * This tells Guice that whenever it sees a dependency on a TransactionLog, 
       * it should satisfy the dependency using a DatabaseTransactionLog. 
       */ 
      bind(IDataBaseAdapter.class).to(DataBaseAdapter.class); 
     } 

    } 

在我的适配器我有这样的:

public class DataBaseAdapter implements IDataBaseAdapter 
    { 
     private DataBaseHelper _dbHelper; 

     private SQLiteDatabase _db; 

     @Inject 
     protected static Provider<Context> contextProvider; 

     public DataBaseAdapter() 
     { 
      _dbHelper = new DataBaseHelper(contextProvider.get()); 
     } 
    } 

如果我不这样做在那里,那里是代码块到适当的地方居住......我在哪里关注注射器?

最后......我的应用程序有它像这样的注射:

public class MyApplication extends RoboApplication 
    { 
     public MyApplication() 
     { 
      super(); 
     } 

     public MyApplication(Context context) 
     { 
      super(); 
      attachBaseContext(context); 
     } 

     @Override 
     protected void addApplicationModules(List<Module> modules) 
     { 
      modules.add(new DataRepository()); 
     } 

     @Inject 
     private IDataBaseAdapter adapter; 

     public IDataBaseAdapter getAdapter() 
     { 
      return adapter; 
     } 

     public void setAdapter(IDataBaseAdapter value) 
     { 
      adapter = value; 
     } 
      ... 
    } 

我试图用进样属性,如图所示。例如:

@Inject 
    private IDataProvider provider; 

一对夫妇的为什么我失去的原因是,我来自一个.NET和Flash/ActionScript中的背景加上我只用StructureMap代替Ninject(在.NET世界)我听说过Guice的设计与Ninject的一些想法有关。有人能帮我弄清楚这一小块吗?

我真的很想专注于使用1.1.2而不是跳到RoboGuice的2.x版本,尤其是因为它仍处于测试阶段,所以我希望你们都不介意。再次

感谢, 凯利

+0

我已更新上面的信息。从下面,并感谢Konstantin Pribluda帮助我,我并不担心getInstance方法,但为什么模块似乎没有加载或缺少数据。 – KellyTheDev

回答

0

好了,我想通了,需要的是什么,但我为什么看到所有的信息飘出来以后那里不太清楚。

我基本上做了这个改变,现在我的测试通过了。

public class DataBaseAdapter implements IDataBaseAdapter 
{ 
    private DataBaseHelper _dbHelper; 

    private SQLiteDatabase _db; 

    @Inject 
    public DataBaseAdapter(Provider<Context> contextProvider) 
    { 
     _dbHelper = new DataBaseHelper(contextProvider.get()); 
    } 
} 

虽然我喜欢使用构造为注入工具,我不知道为什么它有这样的工作方式,考虑到我所看到的例子是某种反射类注射。

无论如何,就是这一部分。希望别人会觉得这很有用。

干杯, 凯利

0

Android是从独立/托管的Java应用程序完全不同。您没有主要(),但你有一定的活动,这些由Android框架管理(活动,服务,广播接收器)

DI是一种技术,它允许您通过 部分将它们连接起来,以消除booler板代码以良好的面向对象的方式。

由于你的工作单位大多活动,您将在onCreate()方法做你的协作对象的接线/创建,并有专门的onResume()和的onPause()方法(见actviity生命周期)

经验法则是,每次活动失去焦点时,这件事情是否需要重新启动?如果是,则在inResume()/ onPause()中进行初始化/销毁,否则 - 在onCreate()

如果您想共享整个应用程序(运行在同一个JVM中)的对象,则可以使用单例模式在android中。所以,你可能只需要单喷油厂,以及来自世界各地的cosult它:

InjectorFactory.getInstance(<context if necessary?>).getInstance(whatever you need); 
+0

感谢您的回复。我了解getInstance方法。对不起,我没有说清楚,但有一种autopopulate的方式,你“注入”,我试图找出... 例如: @Inject 私人IDataProvider提供商; 而在模块中,我会声明此项如下: bind(IDataProvider .class).to(DataProvider.class); – KellyTheDev

+0

我还更新了上面的示例,以包含我为清晰起见而写在此处的示例。 – KellyTheDev