Para las preguntas 1 y 2, vaya con las respuestas de Matthew.
He pasado mucho tiempo tratando de descubrir la mejor manera de estructurar el DAL de las aplicaciones de escritorio. Y la mejor manera realmente depende de las necesidades de la aplicación. En una de mis aplicaciones, tomé el camino de tener una clase DA para cada tabla de base de datos, que se registró con una clase DataProvider central (es decir, singleton) y manejó el CRUD. Cada clase de DA podría decidir si quería almacenar en caché todos los datos de la tabla en RAM o no (¡rendimiento!) Y / o si necesitaba tener la capacidad de activar actualizaciones automáticas de clientes en otros clientes que se ejecutan en otras computadoras (piense en multiusuario concurrencia). Esto hace que sea muy fácil agregar nuevas clases DAL, ya que todo lo que tienen que hacer es ajustarse a la interfaz de registro.
No todos los DAL necesitan este tipo de funcionalidad, pero aprendí que el enfoque en sí mismo (es decir, proveedor de datos singleton y clases DAL simples con registro estático) me hizo la vida mucho más fácil cuando comencé a agregar nuevas clases.
Definitivamente no recomendaría construir el CRUD en clases de nivel superior, a menos que sea una aplicación muy simple. El DAL es una abstracción del almacenamiento de datos. Si decide cambiar su almacenamiento de datos en algún momento en el futuro (incluso si es solo para usar MySQL en lugar de MS SQL), estará muy agradecido por eso. Además: los objetos BLL deben estructurarse según sus relaciones de lógica de negocios. Los objetos DAL están estructurados por los tipos de contenedores de almacenamiento que representan. Las diferencias pueden ser dramáticas.
No NO hacer su clases DAL estática. Lo que gana en la velocidad de codificación lo perderá muchas veces en capacidad de prueba y flexibilidad.