2016-10-13 6 views
1

Я пытаюсь применить DI к моему приложению WPF (с MVVM). Я хотел бы придерживаться onion architecture, и поэтому моя модель имеет интерфейс IRepository, который вводится через контейнер IoC в приложение из его корня композиции.Как вы добавляете зависимости от представления, такие как репозиторий в приложении WPF, без привлечения уровня представления (например, модели представления)?

Есть бесчисленное множество источников like this SO answer и this post on wpftutorial.net, которые говорят о DI с WPF, но которые показать репозиторий впрыскивается в модели представления. Мне это не кажется правильным. Модель представления, на мой взгляд, не должна беспокоить (то есть не знать) репозиторий.

Есть ли способ разработать мое приложение так, чтобы оно надлежащим образом соответствовало архитектуре лука и не включало уровень представления в инъекции зависимостей репозитория (поскольку это возможно, учитывая, что корень композиции должен находиться на верхнем уровне/исполняемый файл, где находятся представления)?

+1

Мое предпочтение заключается в том, чтобы обернуть репозитории в более высокие абстракции, которые инкапсулируют варианты использования и запросы. Вы можете вводить эти абстракции в свою модель просмотра. Взгляните на [это] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91) и [это] (https://www.cuttingedge.it/blogs/steven /pivot/entry.php?id=92), например. – Steven

+0

Я также не поклонник проблем смешивания, но я решил это, представив еще один уровень абстракции, который является ViewModelFactory, который делает всю работу, чтобы составить данную модель. Поскольку я делегирую эту задачу на этот завод, он может получить интерфейс контракта с репозиторием (или IQueryHandlers, как сказал Стивен) в своем конструкторе, и работать с ним позже. – kayess

ответ

1

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

Ссылка здесь должны получить вы начали с помощью единства:

https://msdn.microsoft.com/en-us/library/dn223671(v=pandp.30).aspx

Обновление:
Глядя на метод лука на вашей ссылке, я хотел бы предложить вставляя свой репозиторий в Бизнес/Application Logic layer. И при необходимости вызовы этих методов формируют модель представления.

+0

Спасибо за ваш ответ. Возможно, я не был ясен; Я думал, что тот факт, что я использую DI, подразумевает, что я использую интерфейс для репозитория. Я уже использую контейнер IoC (Ninject). Мой вопрос заключается не в том, что * для инъекции, а в том, где * для инъекции. Я не хочу вводить репозиторий - интерфейс или иначе - на уровне презентации. –

+0

@ rory.ap уточните пожалуйста –