Buenas suspensiones. También estaba pensando en ellos hace unos días.
En realidad, pruebe NHibernate 3.0 alpha (o el tronco actual), su nuevo proveedor de LINQ es mucho mayor que los anteriores. (Hasta ahora solo encontré un método que no funciona, pero es posible enganchar su propio mecanismo si se encuentra con algo que no admite de manera predeterminada.) No tuve problemas (todavía?) Con el uso de la corriente el maletero. Puede encontrar una compilación "nocturna" en el sitio http://www.hornget.net/packages/, junto con una compilación FluentNHibernate. Fluent realmente aumenta su productividad si sabe cómo usarlo. La comunidad SO really helped me with that, también.
Si está de acuerdo con que su capa de negocio tenga una dependencia directa de NHibernate, o si está escribiendo una aplicación más pequeña que puede mantenerse sin este tipo de abstracción, puede continuar sin el patrón de repositorio. Sin embargo, si lo haces bien, puede ahorrarte una gran cantidad de codificación redundante.
La razón para abstraerlo no solo es útil porque luego puede reemplazar NHibernate más adelante con otro ORM, pero es una buena práctica debido a un concepto llamado Separation of Concerns. Su capa de lógica de negocios no debería importar ni saber nada sobre cómo acceder a los datos con los que trabaja. Esto facilita el mantenimiento de la aplicación o sus diferentes capas, lo que también facilita el trabajo en equipo: si X crea la capa de acceso a los datos y Y escribe la lógica de negocios, no tienen que conocer el trabajo de los demás en detalle.
Exponer un IQueryable<T>
es una muy buena idea, y eso es exactamente lo que están haciendo muchas implementaciones de repositorio en este momento. (Y a mí también, aunque preferí escribirlo en una clase estática.) Y, por supuesto, deberá exponer algunos métodos para insertar o actualizar una entidad, o métodos para comenzar y comprometer transacciones, si así lo desea. (The BeginTransaction solo debe devolver un IDisposable
para evitar filtrar una interfaz de NHibernate, y eso estará bien.)
Puedo darle algunas instrucciones: revise las implementaciones de SharpArchitecture o FubuMVC Contrib para obtener algunas ideas sobre cómo hacerlo es correcto, y esto es how I solved it.
¿Cómo agregar un nuevo elemento a la base de datos con solo linq? – Paco
@Paco: Agregar un nuevo elemento a la base de datos es bastante fácil de resumir, no estoy hablando de eso. La consulta es el problema real, ya que no hay una forma simple de habilitar consultas complejas a través de un repositorio sin codificación suficiente. – Groo