0

Исходя из this вопроса, я теперь имею следующую структуру:Ссылка против Dependency

Wolfie.Core - содержит бизнес-логику & сущности, также содержит интерфейсы хранилища (например, IUserRepository) Классов, которые должны получить доступ к хранилищу используются впрыск конструктора.

Wolfie.Data - Ссылки Wolfie.Core и имеет UserRepository реализующий IUserRepository

Так что я доволен этим до сих пор. Core ничего не знает о реализации данных и, следовательно, не зависит ни от чего.

Камнем преткновения, который я получаю, находится в моем веб-слое.

Мой веб-проект ссылается на мой основной проект. Затем я могу добавить новый класс Core, скажем, User, но мне нужно передать конкретную реализацию IUserRepository. Поэтому мне нужно обратиться к моему проекту Data в моем веб-проекте, что кажется неправильным. Теперь он также выглядит так: Web зависит от данных, чего не должно быть.

Итак, как я могу ввести класс Core User классом Data с прямым ссылкой на Data?

С нетерпением жду вашей помощи.

+0

Связанные: http://stackoverflow.com/questions/5267525/dal-bll-gui-composition-root-how-to-setup-di-bindings/5270734#5270734 –

ответ

1

Вы можете привязываться к интерфейсам в своем основном коде приложения, ссылаясь только на сборку контракта (сборка «Core»). Затем используйте отражения для загрузки зависимостей во время выполнения и ввода конкретных классов.

Есть несколько проблем, которые необходимо решить:

  • Как вы найдете необходимые сборки?
  • Какие конкретные классы следует использовать, как только вы найдете свои сборки?
  • Как вы можете свободно настроить приложение для использования этих сборок и конкретных классов? Вы не хотите просто переносить свои жестко закодированные ссылки на сборку и конкретные ссылки на класс, чтобы быть жестко закодированными сборками и строками классов ...

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

Некоторые код конфигурации использования верхнего уровня или модули кода конфигурации (например NInject), некоторые конфигурации использование XML (например Unity), некоторые использовать на основе автоматического механизма обнаружения атрибутов/конвенций (например MAF/MEF), и некоторые используют комбинацию из всех этих (например, Castle.Windsor).

Большинство или все эти библиотеки поддерживают каждый механизм, но я упомянул о наиболее заметном фокусе.

Смежные вопросы