Какая версия RoboGuice работает с Android SDK 8? - PullRequest
0 голосов
/ 12 декабря 2011

Это, вероятно, первая часть моего вопроса.

В основном я борюсь с фактической инъекцией для версии 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 вместо перехода на 2.x RoboGuice ... тем более, что он все еще в бета-версии, поэтому я надеюсь, что вы все не против.

Еще раз спасибо, Келли

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

Хорошо, я выяснил, что было нужно, но я не совсем уверен, почему, увидев всю информацию, всплывающую там.

Я в основном сделал это изменение, и теперь мой тест пройден.

public class DataBaseAdapter implements IDataBaseAdapter
{
    private DataBaseHelper _dbHelper;

    private SQLiteDatabase _db;

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

Хотя мне нравится использовать конструкторы в качестве инструмента для инъекций, я удивляюсь, почему это работало именно так, учитывая, что примеры, которые я видел, являются своего рода инъекцией класса отражения.

В любом случаевот эта часть.Надеюсь, кто-то найдет это полезным.

Приветствия, Келли

0 голосов
/ 12 декабря 2011

Android довольно сильно отличается от отдельного / размещенного Java-приложения.У вас нет функции main (), но у вас есть определенные единицы активности, которые управляются платформой Android (действия, службы, широковещательные приемники)

DI - это метод, который позволяет исключить код пластины загрузчика путем соединениячасти в хорошем объектно-ориентированном виде.

Поскольку ваша единица работы в основном является деятельностью, вы должны выполнить связывание / создание ваших взаимодействующих объектов в методе onCreate (), и есть специальные методы onResume () и onPause () (см. Жизненный цикл actviity)

Практическое правило: нужно ли перезапускать эту вещь каждый раз, когда активность теряет фокус?Если да, инициализируйте / уничтожьте его в inResume () / onPause (), в противном случае - в onCreate ()

И если вы хотите обмениваться объектами с целым приложением (работающим в той же JVM), его можно использоватьсинглтон в андроид.Таким образом, вы можете просто иметь фабрику синглтон-инжекторов и вызывать ее везде:

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