Я не уверен, что «изощренное» - правильное слово, оно действительно зависит от того, что вы определяете как «бизнес-логика», и от того, что вы поддерживаете в чистоте Разделение проблем .
Чтение: GetById, GetByName, GetPaged,
GetByFilter ... e.t.c. методы
Как и вы, я бы назвал все это Чтением, и я думаю, что они в порядке (в частности, GetById).
Некоторые из более темных, которые у вас есть, вероятно, тоже хороши, если они ориентированы на данные.
RE Caching: я делал это в основном в BL, хотя я не вижу причин, почему вы не могли бы сделать это в DAL, если это было подходящим . Если у вас есть куча клиентов, колотящих хранилище данных, и данные меняются не слишком часто - тогда, конечно, почему бы и нет.
RE Граница: На ум приходит пара вещей.
- Я всегда абстрагирую своего фактического поставщика доступа к данным за интерфейсом (); если вы гарантируете, что этот интерфейс очищен от зависимостей (то есть: он будет одинаково хорошо работать для источников данных MS SQL, Oracle, MySQL и NoSQL), то вы на правильном пути - как только вы введете что-либо, специфичное для технологии DAL, в Интерфейс, который вы знаете, что делаете что-то не так (если вы находитесь в .net универсальных типах, таких как DataTables, это хорошо, IMHO).
- Когда вы разрабатываете BL, вы должны иметь представление о размере приложения и вероятных узких местах; следовательно, нет никаких причин, по которым вы не можете быть умными о том, как устроен BL (и это DAL). Поэтому, когда вы сталкиваетесь с бизнес-задачей, которая, как вы знаете, будет забита, возвращает много данных и т. Д. Я думаю, что было бы неплохо рассмотреть вопрос о разработке методов, которые бы эффективно справлялись с ней. Вы можете спроектировать интерфейс как с «объемными», так и со многими меньшими запросами, которые делают одно и то же - таким образом, вы покрываете разные случаи использования. Да, это приведет к снижению удобства обслуживания, но это частично смягчается, если заранее продумать / спроектировать его (немного похоже на то, как вам нужно внедрить систему безопасности в приложение, а не пытаться добавить ее позже в качестве запоздалой мысли) .
Наконец ( imporant ) - вещь в BL в том, что, хотя она часто сложна, она также специфична для приложения / службы, над которой вы работаете; сами данные могут иметь свои собственные правила, и иногда их лучше применять на уровне данных, а не в отдельных приложениях.