Что касается необходимости ссылаться на бизнес-уровень из DAL, я бы согласился, что это, вероятно, не оптимально - более низкие уровни не должны знать о вышеупомянутых уровнях, это уменьшает возможность повторного использования и добавляет дополнительные / потенциально циклические зависимости.
Рассматривали ли вы, чтобы ваши бизнес-объекты "заполнялись" и выполняли свои собственные операции персистентности, используя классы DAL, а не DAL, действующий для них как фабрика (как в вашем текущем проекте)? Таким образом, ваш DAL будет более непосредственным представлением базы данных, а бизнес-объекты будут содержать (бизнес) логику, необходимую для надлежащего заполнения и сохранения.
Кроме того, слой "BLL", который вы специфицируете, на самом деле не кажется мне содержащим бизнес-логику; мне кажется, это скорее уровень персистентных сервисов для сущностей.
Таким образом, вариант того, что вы предлагаете, может быть:
- Web / UI, ссылающиеся на бизнес-объекты
- BusinessEntities, содержит интерфейсы и классы с бизнес-логикой. Уровень данных DataServices
- DataServices, содержит классы, которые загружают, находят и сохраняют данные. Может обслуживать «общие» структуры, содержащие данные (объекты передачи данных), которые могут быть созданы, использованы и обработаны бизнес-объектами. Рекомендации DAL.
- DAL, который просто предоставляет классы, которые отображаются на таблицы.
В зависимости от ваших требований я бы рассмотрел возможность объединения ваших BusinessEntities и DataServices (BLL в вашем первоначальном дизайне) в один уровень; единственная причина, по которой я могу подумать о том, чтобы разделить их, - это если вы делаете что-то вроде Silverlight, где вам нужны асинхронные операции с данными на клиентских бизнес-объектах.
Конечно, все это с неполным знанием ваших конкретных системных требований - вам нужно будет разработать то, что лучше всего подходит для вашего конкретного приложения. Удачи!