Использование 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
}
}
}