Где должны жить контракты на инфраструктурные услуги? - PullRequest
2 голосов
/ 30 сентября 2011

У меня есть UI , Приложение , Домен и Инфраструктура Слои.

В моей Инфраструктуре Уровень использует ссылку Домен и Приложение Уровень для регистрации интерфейсов служб обоих, используя Ninject .

Но мне нужно в моем Приложении Слой службы в Инфраструктура Слой, тогда мне нужно сослаться на Инфраструктура Слой в моем Приложении Слой.

Проблема в Инфраструктура Слой ссылается на Приложение Слой, а когда я буду ссылаться на Инфраструктура Слой в Приложение Слой следующий ошибка шоу:

Ссылка на «Инфраструктура» не может быть добавлена. Добавление этого проекта в качестве ссылки вызовет круговую зависимость.

Как мне это решить? Поместите Ninject Configuration Application Layer в Application Layer? Я думаю, что это не правильно, потому что в моем приложении Layer будет реализована реализация Infrastructure .

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Контракты на инфраструктурные сервисы должны быть определены на уровнях, которые их потребляют (домен и приложение), но реализованы в инфраструктуре.Взгляните на Принцип инверсии зависимостей и Луковая архитектура .Уровень инфраструктуры должен зависеть от приложения и домена.Ваш домен и приложение не должны зависеть от инфраструктуры.Они должны зависеть от абстракции, определенной в их собственных терминах.Вы можете найти этот ответ интересным.Реальная реализация этой абстракции должна быть внедрена при запуске приложения в так называемом Root Composition .

Например, в вашем Приложении вы можете определять и взаимодействовать как:

ICanNotifyUserOfSuccessfullRegistration

Уровень инфраструктуры будет ссылаться на приложение и будет реализовывать этот интерфейс с использованием классов SMTP или SMS:

class SmsNotificator : ICanNotifyUserOfSuccessfullRegistration { ... }

Позже эта реализация будет внедрена в приложение контейнером DI.Приложение не будет зависеть от инфраструктуры, но будет по-прежнему использовать ее, поэтому Dependecny Inversion .Я рекомендую прочитать Внедрение зависимостей в .NET , даже если вы используете Java или другие стеки.

1 голос
/ 30 сентября 2011

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

...