在 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 容器,然后调用它。
我们正在尝试在 MvvmCross 项目中实现 xamarin.android 的 IoC。无法弄清楚如何将 IoC 容器中指定的类型获取到 android 项目(不是 ViewModel)
的 Setup.csSetup.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 容器,然后调用它。