在 xamarin.android 中获取 IoC 容器

Get IoC Container in xamarin.android

我们正在尝试在 MvvmCross 项目中实现 xamarin.android 的 IoC。无法弄清楚如何将 IoC 容器中指定的类型获取到 android 项目(不是 ViewModel)

的 Setup.cs

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); 

我知道要回答这个问题可能需要更多,请询问您需要的。 谢谢

您不需要这一行来解决问题:

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

就像 Mvx.Resolve<T> 一样简单 但服务定位器模式确实不是最佳实践。

Mvx 通常与构造函数注入一起使用,但恐怕您不能在 android 视图上使用它。 相反,您可以在 ViewModel 中执行此操作:

public ITaskFilter TaskFilter { get; private set };

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

然后从您的视图中您可以访问 ViewModel.TaskFilter

我得到了这个工作,使用:

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

只需要使用Mvx.Resolve不需要使用ViewModel。只需在 Android 视图的 setup.cs 中设置 IoC 容器,然后调用它。