#.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();
}