Внедрение зависимостей для нескольких экземпляров без сервисного локатора - PullRequest
0 голосов
/ 07 декабря 2018

Я пишу приложение WPF, используя Unity в качестве Ioc для внедрения зависимостей

Я создаю свое главное окно с помощью:

container.RegisterType<IMainWindow, MainWindow>();
container.RegisterType<ISecondWindow, SecondWindow>();

container.Resolve<IMainWindow>().Show();

Все другие окна внедряются, например, с помощью внедрения зависимостив моем «MainWindow» я могу открыть через кнопку «SecondWindow», поэтому у меня есть ISecondWindow в конструкторе MainWindow

public partial class MainWindow: Window, IMainWindow
{
    public MainWindow(IMainWindowViewModel viewModel, ISecondWindow secondWindow)
    {
        //with this solution I can open the second window from IMainWindowViewModel (viewmodels has no reference to windows which are in a separate project)
        viewModel.OpenSecondWindow += (s,e) => secondWindow.Show();
    }

SecondWindow не имеет других окон, поэтому он определяет только ViewModels в своем конструкторе

public partial class SecondWindow: Window, ISecondWindow
{
    public SecondWindow(ISecondWindowViewModel viewModel)

все зависимости затем разрешаются каскадно (WINDOW -> VIEWMODEL -> SERVICE -> REPOSITORY)

Это прекрасно работает, пока у меня только один экземпляр моего второго окна, но ...

что делать, если я могу одновременно открыть N окон / экземпляр моего ISecondWindow (например, у меня есть список, я дважды щелкаю по первой строке, и окно ISecondWindow открыто с деталями первой строки, затем я дважды щелкаюво втором ряду и ДРУГОЕ ISecondWindow открыто с деталями второго ряда (так что я могу просматривать детали первого и второго ряда одновременно))?

с DI это не может быть выполнено, потому что у меня есть и я могу использовать только один экземпляр моего ISecondWindow.

Единственное решение, которое я имею в виду для решения этой проблемы, - это использование Сервиса.локатор, но сервисный локатор - это анти-паттерн, и я бы не стал его использовать.

У вас есть какие-нибудь идеи / предложения для решения этой проблемы?

1 Ответ

0 голосов
/ 07 декабря 2018

Попробуйте зарегистрировать ISecondWindow с помощью TransientLifetimeManager.

http://www.tutorialsteacher.com/ioc/lifetime-manager-in-unity-container

...