我们正在尝试在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);
我知道回答这个问题可能需要更多,请询问您需要的问题。 谢谢
答案 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容器,然后调用它。