Как мне справиться с двунаправленной зависимостью между моим бизнесом и уровнями доступа к данным? - PullRequest
0 голосов
/ 10 марта 2010

У меня есть приложение с тремя уровнями (презентация, бизнес-логика и доступ к данным). На уровне доступа к данным у меня есть объект с именем Unit, а на бизнес-уровне у меня есть еще один объект с именем Unit.

Когда Insert() вызывается для объекта Unit на бизнес-уровне, он вызывает метод Insert() для соответствующего объекта на уровне доступа к данным и передает себя в качестве параметра. Проблема, с которой я столкнулся, заключается в том, что уровень доступа к данным не ссылается на бизнес-уровень, и его разрешение может вызвать циклические зависимости.

Мой подход некорректен? Если так, что было бы хорошим решением моей проблемы?

1 Ответ

2 голосов
/ 10 марта 2010

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

Похоже, вы смешиваете два несовместимых понятия.

Во-первых, вы заявляете, что в вашем коде есть три уровня: презентация, бизнес и доступ к данным. Проблема с этим утверждением заключается в том, что вы также утверждаете, что используете активную запись подобный шаблон (unit.Insert()). Если у вас действительно есть отдельный домен (бизнес) и постоянный уровень (доступ к данным), то доменные объекты не знают, как Insert().

Посмотрите на шаблон хранилища . Этот шаблон лучше подходит для создания отдельного персистентного слоя. Если вы используете этот шаблон, вы можете определить «сущность» в слое постоянства и отобразить ваш объект Unit в слое домена на объект Unit в слое постоянства. AutoMapper избавит вас от необходимости вручную сопоставлять модель домена с сущностью.

...