Как передать контейнер Unity на дочернюю страницу из окна для DI - PullRequest
0 голосов
/ 24 ноября 2018

Мне удалось настроить DI с помощью Unity:

App.xaml.cs

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    IUnityContainer container = new UnityContainer();

    container.RegisterType<ApplicationDbContext>();

    container.RegisterType<MainWindowViewModel>();
    container.RegisterType<PageConsignmentsViewModel>();

    container.RegisterType<MainWindow>();
    container.RegisterType<PageConsignments>();

    var mainWindow = container.Resolve<MainWindow>();
    var pc = container.Resolve<PageConsignments>();
    mainWindow.Show();
}

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    [Dependency]
    public MainWindowViewModel ViewModel
    {
        set => DataContext = value;
    }

    public MainWindow()
    {
        InitializeComponent();
    }
}

MainWindowViewModel.cs

public class MainWindowViewModel : BaseViewModel
{
    private Page currentPage;
    public Page CurrentPage { get { return currentPage; } set { currentPage = value; OnPropertyChanged("CurrentPage"); } }

    private readonly ApplicationDbContext db;

    public MainWindowViewModel(ApplicationDbContext db)
    {
        this.db = db;

        CurrentPage = new PageConsignments();
    }

    #region Navigation Menu Commands
    ...
    #endregion
}

И я вижу, что Db был введен в MainWindow и DataContext является правильным (новыйэкземпляр MainWindowViewModel).

Однако, когда я перехожу к ConsignmentsPage с помощью CurrentPage = new PageConsignments, я вижу, что ConsingmentsPage.DataContext является нулевым - вероятно, потому что это новое представление не находится в моем контейнере Unity.

Я думаю, что мне удалось решить эту проблему с помощью:

    IUnityContainer container = new UnityContainer();
    container.RegisterType<ApplicationDbContext>();
    container.RegisterType<PageConsignmentsViewModel>();
    var pc = container.Resolve<PageConsignments>();
    CurrentPage = pc;

, но мне было интересно - это рекомендуемый метод, или есть какой-то способ, которым я могу определить все этиDI в App.OnStartup вместо создания нового контейнера для каждой навигации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...