Adoptaría un enfoque pragmático: históricamente, el principal 'beneficio' de mantener la lógica de negocios en procesos almacenados es por razones de rendimiento (arquitectura de 2.5 niveles), mientras que la separación de la lógica de negocios en un nivel BLL (nivel 3 / N) es generalmente más limpio de un perspectiva de mantenimiento y más fácil de probar (Mock / Stub out el acceso a datos).
Sin embargo, dado que los ORMS .NET habilitados para LINQ como LINQ2SQL, EF y NHibernate ahora crean consultas SQL parametrizadas, donde los planes de consulta se pueden almacenar en caché, se escapan para inyección SQL, etc., supongo que el movimiento hacia la arquitectura de nivel 3 / N es más convincente que nunca, y la mayoría de los SPROC (especialmente los centrados en consultas) se pueden evitar por completo. Los patrones de repositorio en .NET comúnmente exponen los parámetros del árbol IQueryable / accept Expression, lo que permite un acceso seguro y flexible a sus tablas. (Personalmente en arquitecturas de tipo SOA, no expondría IQueryable más allá de BLL, es decir, sus niveles de Servicio y Presentación deberían funcionar con un conjunto bien definido de métodos. La razón es que de lo contrario nunca podrá probar completamente su sistema, y ganó '
Sin embargo, en un sistema de tamaño decente, siempre habrá algunas excepciones, en las que una pieza de código realmente intensiva en datos aún podría tener que escribirse como un Procedimiento almacenado por razones de rendimiento. En estos casos, mantendría el SPROC y expondría el SPROC a través del ORM, pero aún expondría la función como un método de transferencia en su BLL.