Ссылка против зависимости - PullRequest
0 голосов
/ 10 февраля 2012

Исходя из этого вопроса, у меня теперь есть следующая структура:

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 10 февраля 2012

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

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

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

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

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

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

...