Xamarin Prism7-IUnityContainer不';我没有注册的类型
我正在用PRISM构建我的第一个Xamarin移动应用程序(android/iOS)。 我正在学习这个非常有用的教程 问题是注入我的ViewModels的IUnityContainer没有我在PrismApplication的RegisterTypes(IContainerRegistry containerRegistry)函数中注册的类型 我的问题是: 如何将类型注册到IUnityContainer中,以便在ViewModel中解析它们?Xamarin Prism7-IUnityContainer不';我没有注册的类型,xamarin,xamarin.forms,unity-container,prism-7,prism.xamarin,Xamarin,Xamarin.forms,Unity Container,Prism 7,Prism.xamarin,我正在用PRISM构建我的第一个Xamarin移动应用程序(android/iOS)。 我正在学习这个非常有用的教程 问题是注入我的ViewModels的IUnityContainer没有我在PrismApplication的RegisterTypes(IContainerRegistry containerRegistry)函数中注册的类型 我的问题是: 如何将类型注册到IUnityContainer中,以便在ViewModel中解析它们? public partial class App :
public partial class App : PrismApplication
{
public App(IPlatformInitializer Initializer) : base (Initializer) { }
protected override async void OnInitialized()
{
InitializeComponent();
MainPage = this.Container.Resolve<MainPage>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//I have read that these registrations should not be necessary, however it crashes if I remove them because I inject them into some view models
containerRegistry.Register<INavigationService, Prism.Navigation.PageNavigationService>();
containerRegistry.Register<IPageDialogService, Prism.Services.PageDialogService>();
containerRegistry.Register<IEventAggregator, Prism.Events.EventAggregator>();
containerRegistry.Register<IUnityContainer, UnityContainer>();
//Pages
containerRegistry.RegisterForNavigation<MainPage, MainPageViewModel>();
containerRegistry.RegisterForNavigation<AboutPage, AboutViewModel>();
containerRegistry.RegisterForNavigation<ItemDetailPage, ItemDetailViewModel>();
containerRegistry.RegisterForNavigation<ItemsPage, ItemsViewModel>();
containerRegistry.RegisterForNavigation<NewItemPage, NewItemViewModel>();
}
}
public partial class MainPage : MasterDetailPage
{
public MainPageViewModel Model
{
get { return BindingContext as MainPageViewModel; }
set { BindingContext = value; }
}
private IUnityContainer _Container;
public MainPage(IUnityContainer container, ItemsPage detail, MainPageViewModel model)
{
InitializeComponent();
MasterBehavior = MasterBehavior.Popover;
Model = model;
Detail = detail;
_Container = container; // I cannot use this container to resolve any of my registered types ???
// for example, _Container cannot be used to resolve a <ItemsPage>
}
}
或
如何获取包含已注册类型的容器?
public partial class App : PrismApplication
{
public App(IPlatformInitializer Initializer) : base (Initializer) { }
protected override async void OnInitialized()
{
InitializeComponent();
MainPage = this.Container.Resolve<MainPage>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//I have read that these registrations should not be necessary, however it crashes if I remove them because I inject them into some view models
containerRegistry.Register<INavigationService, Prism.Navigation.PageNavigationService>();
containerRegistry.Register<IPageDialogService, Prism.Services.PageDialogService>();
containerRegistry.Register<IEventAggregator, Prism.Events.EventAggregator>();
containerRegistry.Register<IUnityContainer, UnityContainer>();
//Pages
containerRegistry.RegisterForNavigation<MainPage, MainPageViewModel>();
containerRegistry.RegisterForNavigation<AboutPage, AboutViewModel>();
containerRegistry.RegisterForNavigation<ItemDetailPage, ItemDetailViewModel>();
containerRegistry.RegisterForNavigation<ItemsPage, ItemsViewModel>();
containerRegistry.RegisterForNavigation<NewItemPage, NewItemViewModel>();
}
}
public partial class MainPage : MasterDetailPage
{
public MainPageViewModel Model
{
get { return BindingContext as MainPageViewModel; }
set { BindingContext = value; }
}
private IUnityContainer _Container;
public MainPage(IUnityContainer container, ItemsPage detail, MainPageViewModel model)
{
InitializeComponent();
MasterBehavior = MasterBehavior.Popover;
Model = model;
Detail = detail;
_Container = container; // I cannot use this container to resolve any of my registered types ???
// for example, _Container cannot be used to resolve a <ItemsPage>
}
}
公共部分类应用程序:PrismApplication
{
公共应用程序(IPlatformInitializer初始值设定项):基(初始值设定项){}
受保护的重写异步void OnInitialized()
{
初始化组件();
MainPage=this.Container.Resolve();
}
受保护的覆盖无效注册表类型(IContainerRegistry containerRegistry)
{
//我已经读到这些注册不应该是必需的,但是如果我删除它们,它会崩溃,因为我将它们注入到一些视图模型中
containerRegistry.Register();
containerRegistry.Register();
containerRegistry.Register();
containerRegistry.Register();
//页数
containerRegistry.RegisterForNavigation();
containerRegistry.RegisterForNavigation();
containerRegistry.RegisterForNavigation();
containerRegistry.RegisterForNavigation();
containerRegistry.RegisterForNavigation();
}
}
公共部分类主页面:MasterDetailPage
{
公共主页视图模型
{
获取{返回BindingContext作为MainPageViewModel;}
设置{BindingContext=value;}
}
专用IUnityContainer\u容器;
公共主页(IUnityContainer容器、ItemsPage详细信息、主页视图模型)
{
初始化组件();
MasterBehavior=MasterBehavior.Popover;
模型=模型;
细节=细节;
_Container=Container;//我无法使用此容器解析任何已注册的类型???
//例如,_容器不能用于解析
}
}
首先,您不需要将IUnityContainer作为依赖项参数传递并手动解析,您可以直接将所需的服务作为参数传递,它将由框架自动解析
其次,您应该在ViewModel中传递依赖项,而不是视图,因为所有逻辑都应该在ViewModel中编写
private INavigationService _navigationService;
private IPageDialogService _dialogService;
public MainPageViewModel(INavigationService navigationService, IPageDialogService dialogService)
{
_navigationService = navigationService;
_dialogService = dialogService;
}
这些服务将通过框架解决,并可在ViewModel中使用 虽然我不熟悉Xamarin,但在.NETFramework应用程序中,您无法通过DI访问容器。事实上,DI的全部要点首先是让容器为您连接所有内容。你唯一需要参考它的时间是在注册时。根据集装箱注册和集装箱是两件独立的事情。我建议你遵循@Mukesh Modhvadiya的建议。var itemsPage=App.Current.Container.Resolve()?
private INavigationService _navigationService;
private IPageDialogService _dialogService;
public MainPageViewModel(INavigationService navigationService, IPageDialogService dialogService)
{
_navigationService = navigationService;
_dialogService = dialogService;
}