Внедрение зависимостей WPF с помощью NavigationService

#.net #wpf #dependency-injection

#.net #wpf #внедрение зависимостей

Вопрос:

Я ищу лучший подход, используя DI в моем приложении WPF. Я использую frame и NavigationService для навигации между вкладками. Я использую WPF с.NET framework 4.7.2, EF Core и для DI я использую Microsoft.Расширения.DependencyInjection (DI из .NET Core).

Все работает хорошо, но навигация между страницами может стать немного запутанной. Мое главное окно выглядит следующим образом, загружая зависимость. Однако я хочу использовать IPersonOrchestration на странице профиля пользователя, и я должен передать его в параметре, чтобы использовать его там.

     private readonly IPersonOrchestration_personOrchestration;
    public MainWindow(IPersonOrchestration personOrchestration)
    {
        _personOrchestration = personOrchestration;
        
        InitializeComponent();

        _mainFrame.NavigationService.Navigate(new UserProfile(personOrchestration));
    }
  

Страница моего профиля пользователя, где я хочу использовать эту оркестровку:

     private readonly IPersonOrchestration_personOrchestration;
    public UserProfile(IPersonOrchestration personOrchestration)
    {
        _personOrchestration = personOrchestration;
        
        InitializeComponent();
    }
  

А из UserProfile будет еще больше шагов, и с этой реализацией мне пришлось бы передавать оркестровку из MainWindow в каждом параметре на каждом шаге.
Есть ли способ инициализировать зависимость непосредственно в UserProfile и не передавать параметр с навигацией?

Ответ №1:

Хорошо, я нашел возможное решение (хотя я не уверен, что это лучший способ) Изменение MainWindow на это:

 public readonly IPersonOrchestration _personOrchestration;
public static MainWindow AppWindow

public MainWindow(IPersonOrchestration personOrchestration)
{
    AppWindow = this;
    _personOrchestration = personOrchestration;
    
    InitializeComponent();

    _mainFrame.NavigationService.Navigate(new UserProfile());
}
  

Оркестровка была обнародована, и я добавил общедоступную ссылку на главное окно, поскольку каждая вторая страница является «дочерней» для MainWindow.
Затем загрузка оркестровки в пользовательский профиль следующим образом:

 private readonly IPersonOrchestration _personOrchestration;
public UserProfile()
{
    if (MainWindow.AppWindow?._personOrchestration!= null)
    _personOrchestration = MainWindow.AppWindow._personOrchestration;
    
    InitializeComponent();
}