Использование TinyIoC в Xamarin.Android

Я немного устал от жестких ссылок, которые я нашел в приложении Xamarin.Android, которое я унаследовал - действия, ссылающиеся на действия, забавные вещи, происходящие в обратных вызовах и т. Д. Поэтому я решил зарегистрировать действия в TinyIoC и разрешать их при необходимости.

Это какое-то время работало, пока я не начал замечать странные вещи, происходящие. Если приложение оставалось в одиночестве в течение долгого времени, оно зависало бы - просматривая журналы, это потому, что I-oC не может выполнить одно из действий - где это было возможно до того, как приложение оставалось на долгое время.

Об этом написано GC - если вы спросите меня. GC, очевидно, почему-то не рассматривает элементы в IoC в качестве ссылки и избавляется от них.

Это кто-то еще сталкивался? Если так, то как вы преодолели это?

2 ответа

Решение

Мой совет - не использовать TinyIoC или любой другой IoC для управления действиями и т. Д. В Android. Похоже, что Android хочет управлять состоянием объектов таким образом, чтобы это нарушалось при использовании IoC.

Это приведет к множеству проблем, которые трудно решить, и которые невозможно отладить.

Проверьте http://welltechnically.com/?p=2671 - см. Пункт 3.

Я еще не пробовал, но выглядит многообещающе.

Ниже копируется и вставляется непосредственно...

"Будьте осторожны при использовании статических переменных. Не думайте, что когда вы инициализируете их в упражнении 1 - они будут инициализированы в упражнении 2. Единственным безопасным местом для инициализации глобальной статики будет класс Application".

"Марк также предложил использовать DDMS для имитации этого сценария. Я следовал инструкциям и завершил процесс после запуска. Как и предполагалось, возобновившееся действие попыталось использовать контейнер IoC для получения уровня обслуживания и быстро выбросило все его игрушки из кроватка. Если бы я вместо этого подклассифицировал Application и выполнил настройку там, я всегда мог убедиться, что зависимости были настроены при каждом запуске процесса:"

using System;
using Android.App;
using Android.Runtime;
using SomeApplication.Common.Services;

namespace SomeApplication.Android
{
[Application(Debuggable = true, Icon = "@drawable/AppIcon", Label = "My Application")]
class MyApplication : Application
{
public MyApplication(IntPtr ptr, JniHandleOwnership ownership) : base(ptr, ownership)
{
}

public override void OnCreate()
{
base.OnCreate();

#if DEBUG
ServiceFactory.Initialize(ServiceFactoryType.Mock);
#else
ServiceFactory.Initialize(ServiceFactoryType.Service);
#endif
}
}
}
Другие вопросы по тегам