2014-01-25 2 views
1

Я пытаюсь использовать простой Инжектор в проект, который имеет следующую архитектуру:Простой Injector в своем собственном проекте

  • DAL слой (владеет хранилищами)
  • BLL слой (владеет услуги, переговоры с хранилищами),
  • Уровень MVC (переговоры с службами в слое BLL).

, когда речь идет о регистрации в контейнере классы и интерфейсы, I`m сталкиваются с проблемой, просто Injector нуждается во мне, чтобы зарегистрировать хранилище с его интерфейсом (как мои классы в слое службы принимает репозиторий их конструктор)

Итак, на самом деле простой инжектор заставляет меня добавлять ссылки на мой слой DAL в моем MVC-слое, который мне очень нравится избегать.

Мой вопрос: возможно ли/сделать внешний проект, который будет содержать только простой инжектор, и этот проект будет иметь ссылку на все другие проекты, и таким образом я смогу зарегистрировать то, что хочу, и все еще держать моя абстракция проекта?

или есть какой-либо другой простой способ решить эту проблему?

+1

возможно дубликат [? IoC/DI - Почему я должен ссылаться на все слои/сборки в приложении ввода] (http://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have-to-reference-all-layers-assemblies-in-entry-application) – Steven

+0

да, спасибо. хотя я до сих пор не полностью его понимаю, поэтому мое приложение MVC (которое имеет Root - global.asax) должно ссылаться на все другие проекты? и на диаграмме, полученной в ответном ответе, все остальные проекты не ссылаются ни на какой другой проект. как я не мог ссылаться на мой слой BLL на мой слой DAL? Мне нужно это знать, какой тип я получаю в своем конструкторе. или я должен поместить все интерфейсы в общий проект? Еще раз спасибо. – jony89

+0

Вы прочитали второй ответ (который мой)? Корень композиции должен ссылаться на * все * другие проекты, неявно или явно; нет никакого способа обойти это, это хорошо, и вы не должны пытаться предотвратить это. Поскольку вы решили поместить Root Composition и ваш уровень презентации в одну и ту же сборку, эта сборка также ссылается на все другие проекты. Это, однако, не означает, что ваш слой * презентации * ссылается на все остальные слои. – Steven

ответ

2

Контейнер DI (например, ваш простой инжектор) следует указывать только из корня композиции. Все остальные модули не должны иметь ссылки на контейнер.

Вы можете прочитать больше о композиции Root здесь:

http://blog.ploeh.dk/2011/07/28/CompositionRoot/

Что больше DI Контейнер следует применять Регистр Resolve Освободить рисунок целиком внутри композиции корня. Подробнее об этой модели здесь:

http://blog.ploeh.dk/2010/09/29/TheRegisterResolveReleasepattern/

+0

То, что я говорю, это то, что я сделал, у меня есть приложение MVC, и поэтому я помещаю команды Register в global.asax (на самом деле, я использовал SimpleInjector для быстрой установки, поэтому для этого используется внешний класс, но он использует global.asax), но это не решает мою проблему, даже если я пишу регистрацию в своем global.asax, мне все равно нужна ссылка из моего слоя MVC на мой слой DAL. – jony89

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