.NET использует транзитивные зависимости/ссылки

У меня есть решение Visual Studio с 3 проектами:

  • Мой веб-сайт (А)
  • Бизнес-модель (Б)
  • Стойкость (С)

Persistence, проект C, зависит от NHibernate и содержит все интерфейсы репозитория, Hibernate реализации этих репозиториев и классы, которые сопоставляются с таблицами БД.

BusinessModel, проект B, зависит от C и содержит все классы обслуживания и классы, представляющие объекты бизнес-домена. Эти сервисы используют репозитории для извлечения данных, а затем преобразуют эти данные в бизнес-представления на поверхности в своих собственных интерфейсах.

MyWebSite, проект A, зависит от A и содержит все классы/файлы MVC. Контроллеры MVC здесь используют класс службы из B для выполнения любых функций бизнес-логики. На этом уровне нет сведений о том, что проект B использует репозитории проекта C для выполнения своих операций.

В идеальном мире я бы предположил, что проект A должен ссылаться на B, который ссылается на C, который ссылается на NHibernate. Это не похоже на правду. Я считаю, что проекту A нужна ссылка на B и C и NHibernate! Мне не нравится идея, что моему веб-приложению требуются знания о моей серверной архитектуре, и я особенно не хочу, чтобы это было известно того факта, что я использую NHibernate в качестве ORM.

Есть ли способ указать этим проектам использовать транзитивные зависимости при разрешении их ссылок?

Мой проект — .NET 4 в Visual Studio 2010, если эта информация имеет значение.

РЕДАКТИРОВАТЬ: я нашел этот ответ SO на связанный с этим вопрос, который объясняет, что эти ссылки нужны только в том случае, если классы проекта C появляются из проекта B. Я был очень полон решимости не допускать утечек между слоями, и я знаю, что классы Hibernate используются только в C, поэтому, возможно, я просто неправильно понимаю...


person Jesse Webb    schedule 08.09.2011    source источник
comment
Возможно, вы захотите немного почитать луковую архитектуру. Это может вам помочь: jeffreypalermo.com/blog/the-onion-architecture -часть-1   -  person rie819    schedule 08.09.2011
comment
@ rie819 - Я также использовал архитектуру Onion в других проектах, но не в .NET. Я считаю, что это будет подвержено той же проблеме зависимости/ссылки, однако, когда самому приложению потребуется знание любых транзитивных зависимостей, потому что они все еще являются слоями архитектуры. Шаблон Onion просто перемещает некоторые проблемы на другие уровни, но уровни все еще есть, и я хотел бы, чтобы внешние/верхние уровни не зависели от реализации более низких уровней.   -  person Jesse Webb    schedule 09.09.2011