Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin Prism7-IUnityContainer不';我没有注册的类型_Xamarin_Xamarin.forms_Unity Container_Prism 7_Prism.xamarin - Fatal编程技术网

Xamarin Prism7-IUnityContainer不';我没有注册的类型

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 :

我正在用PRISM构建我的第一个Xamarin移动应用程序(android/iOS)。 我正在学习这个非常有用的教程

问题是注入我的ViewModels的IUnityContainer没有我在PrismApplication的RegisterTypes(IContainerRegistry containerRegistry)函数中注册的类型

我的问题是:

如何将类型注册到IUnityContainer中,以便在ViewModel中解析它们?

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