1

Мы пытаемся реализовать IoC от xamarin.android в проекте MvvmCross. Не могу понять, как получить тип, указанный в IoC контейнер в Setup.cs, из андроида проекта (не ViewModel)Получить контейнер IoC в xamarin.android

Setup.cs

protected override IMvxIoCProvider CreateIocProvider() 
    { 
     _provider = base.CreateIocProvider(); 
     return _provider; 
    } 
    protected override void InitializeFirstChance() 
    { 
     _provider.RegisterSingleton<INotificationService>(new NotificationService(ApplicationContext)); 
     _provider.RegisterType<ITaskFilter>(() => new FilterView()); 
     base.InitializeFirstChance(); 
    } 

В Android MvxActivity, у нас есть два возможных пути, но первый из них не работает, а второй нарушает принципы SOLID, которые мы пытаемся выполнить.

[MvvmCross.Platform.IoC.MvxInject] 
public ITaskFilter TaskFilter { get; set; } 

И

public TasksView() 
    { 
     var taskFilter = MvvmCross.Platform.IoC.MvxSimpleIoCContainer.Instance.Resolve<ITaskFilter>(); 
    } 

TaskFilter.Initialize(this); 

Я знаю, что, вероятно, будет более необходимыми для этого вопроса ответить, пожалуйста, обратитесь за то, что вам нужно. Благодаря

ответ

2

вам не нужна эта линия для решения материал:

MvvmCross.Platform.IoC.MvxSimpleIoCContainer.Instance.Resolve<ITaskFilter>(); 

подмигнули так просто, как Mvx.Resolve<T> Но это правда, что служба локатора модель не лучшая практика.

Mvx обычно работает с инжектором конструктора, но я боюсь, что вы не можете использовать его на андроид-сайтах. Вместо этого, вы можете сделать это в ViewModel:

public ITaskFilter TaskFilter { get; private set }; 

public YourViewModel(ITaskFilter taskFilter) 
{ 
    this.TaskFilter = taskFilter; 
} 

Тогда из вашего зрения, вы можете получить доступ к ViewModel.TaskFilter

+0

Спасибо @xleon. Интерфейс ITaskFilter находится в представлении android, потому что он специфичен для Android и IoC, которые мы хотим там. Поэтому хотелось бы оставить его вне ViewModel, иначе зависимость создается на интерфейсе вида Android, из ViewModel. Но, как вы уже упоминали, нет способа использовать его в андроид-представлениях, поэтому кажется, что мы хотим сделать это, не получится так, как надеялись. – cfl

1

я получил эту работу, с:

public ITaskFilter TaskFilter { get; set; } 
protected override void OnCreate(Bundle bundle) 
{ 
    TaskFilter = Mvx.Resolve<ITaskFilter>(); 
    TaskFilter.Initialize(this); 
} 

Просто, необходимые для использования Mvx.Resolve Нет необходимости использовать ViewModel. Просто установите контейнер IoC в setup.cs Android-вида, затем вызвал его.

Смежные вопросы