1

我正在使用 PRISM 构建我的第一个 Xamarin 移动应用程序(android / iOS)。我正在关注这个非常有用的教程https://xamgirl.com/prism-in-xamarin-forms-step-by-step-part-1/

问题是注入到我的 ViewModel 中的 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> 
    }
}
4

1 回答 1

1

首先,你不需要将 IUnityContainer 作为依赖参数传递并手动解析它,你可以直接将所需的服务作为参数传递,它将由框架自动解析。

其次,您应该在 ViewModel 中传递依赖项,而不是视图,因为所有逻辑都应该在 ViewModel 中编写。

private INavigationService _navigationService;
private IPageDialogService _dialogService;

public MainPageViewModel(INavigationService navigationService, IPageDialogService dialogService)
{
    _navigationService = navigationService;
    _dialogService = dialogService;
}         

这些服务将由框架解析并准备好在您的 ViewModel 中使用。

于 2019-12-18T06:56:48.250 回答