0

这可能是我的问题之一。

基本上我正在为 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 属性。例如:

    @Inject 
    private IDataProvider provider; 

我迷路的几个原因是我来自 .NET 和 Flash/ActionScript 背景,而且我只使用了 StructureMap 而不是 Ninject(在 .NET 世界中),我听说 Guice 是用一些设计的Ninject 的想法。有人可以帮我弄清楚这个小块吗?

我真的很想专注于使用 1.1.2 而不是跳到 RoboGuice 的 2.x ......特别是因为它仍处于测试阶段,所以我希望大家不要介意。

再次感谢,凯利

4

2 回答 2

0

Android 与独立/托管的 java 应用程序完全不同。您没有 main() ,但您有某些活动单元,由 android 框架管理(活动、服务、广播接收器)

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

由于您的工作单元主要是活动,您应该在 onCreate() 方法中连接/创建协作对象,并且有专用的 onResume() 和 onPause() 方法(请参阅活动生命周期)

经验法则是,每次活动失去焦点时都需要重新启动这个东西吗?如果是,则在 inResume() / onPause() 中初始化/销毁它,否则 - 在 onCreate() 中

如果您想与整个应用程序共享对象(在同一 JVM 中运行),则可以在 android 中使用单例模式。所以你可能只有单例注射器工厂,并从任何地方咨询它:

 InjectorFactory.getInstance(<context if necessary?>).getInstance(whatever you need);
于 2011-12-12T07:48:32.920 回答
0

好的,我已经弄清楚需要什么,但是在看到所有信息浮出水面后,我不太确定为什么。

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

public class DataBaseAdapter implements IDataBaseAdapter
{
    private DataBaseHelper _dbHelper;

    private SQLiteDatabase _db;

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

虽然我喜欢使用构造函数作为注入工具,但我想知道为什么它必须以这种方式工作,因为我看到的示例是某种反射类注入。

无论如何,这就是这部分。希望其他人会发现这很有用。

干杯,凯利

于 2011-12-14T05:17:51.910 回答