在xamarin.android中获取IoC Container

时间:2016-06-22 12:46:58

标签: c# xamarin.android mvvmcross ioc-container solid-principles

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

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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

我得到了这个,有:

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容器,然后调用它。