2011-01-31 17 views
9

Tomando el enfoque tradicional de 3 capas (no necesariamente 3 niveles):¿Cómo se implementa un modelo de 3 capas con NHibernate?

IU BLL DAL

¿Cómo NHibernate en forma? En la mayoría de los casos veo personas que permiten a NHibernate poblar directamente objetos/entidades de dominio, lo que obviamente requiere una referencia de NHibernate a estas entidades. Si las entidades de dominio son parte del BLL, esto parece requerir una referencia del DAL (donde reside NHibernate) al BLL (donde residen los objetos de dominio).

¿No va esto contra el pensamiento típico de separar cada capa, con cada capa solo dependiendo de la que está debajo? ¿Que me estoy perdiendo aqui?

+0

Puede ir a [este enlace] (http://www.primaryobjects.com/cms/article119.aspx) que ilustra la mejor manera de diseñar la aplicación NHibernate en capas utilizando [Modelo de repositorio] (http: // www. primaryobjects.com/cms/article119.aspx) – viento

Respuesta

9

Te puedo dar un ejemplo, la forma general I Layer con NHibernate para una arquitectura multicapa: capa

de acceso a datos

Ejemplo para un mapeo:

public class CategoryMap : ClassMap<Domain.Entities.Category> 
{ 
    public CategoryMap() 
    { 
     ... 
    } 
} 

Capa empresarial

  • Repositories: BaseRepository

Ejemplo para un repositorio:

public class CategoryRepository : BaseRepository<Domain.Entities.Category>, 
    Domain.DataInterfaces.Business.Repositories.ICategoryRepository 
{ 
    public CategoryRepository(ISession session) 
     : base(session) 
    { 
    } 
} 
  • BaseRepository (CRUD, GetById, GetAll)

Ejemplo para un repositorio de la base:

public class BaseRepository<T> : IBaseRepository<T> 
{ 
    public ISession Session { get; set; } 

    public BaseRepository(ISession session) 
    { 
     Session = session; 
    } 
} 

Capa de dominio

  • DataInterfaces (IRepository, IBaseRepository)
  • entidades: BaseEntity
  • Persistencia (IEntity, IBaseEnity)

Por lo tanto, la única capa que hace referencia a NHibernate es en realidad la capa de datos y el negocio (NHibernate.ISession).La capa de dominio se comparte entre todas las capas y no conoce NHibernate. Para simplificar, podría fusionar el negocio y la capa de datos en una sola capa. Generalmente tiendo a separarlos, pero depende del tamaño del proyecto.

enter image description here

Si realmente desea la separación, yo también sugieren que echar un vistazo a dependency injection para reducir las dependencias entre las diferentes capas.

Espero que te ayude.

+0

Gracias Martin. ¿Qué es exactamente NHibernate volviendo a la capa empresarial? Tal vez un ejemplo de código corto podría explicar? –

+0

DAL solo es llamado por BL y devuelve la sesión de NHibernate y las asignaciones de NHibernate. Nada mas. Agregué algunos ejemplos, espero que se vuelva más claro. –

+1

Los repositorios no deben contener lógica de negocios ... Deben estar en el DAL. – Phill

4

NHibernate es más adecuado para una arquitectura diferente (todavía en capas, pero no apiladas de la misma manera).

capa

La presentación utiliza NHibernate como Data Mapper (y Unit of Work) para desacoplar su Domain Model (es decir, su lógica de negocio) de las preocupaciones de persistencia.

+0

En la arquitectura que describes, ¿qué son las capas y cómo se referencian entre sí? –

+0

Diría que obtienes ** una capa de presentación ** que sabe acerca del ** correlacionador de objetos ** y ** modelo de dominio ** (capa de negocios si quieres), mientras que el ORM también conoce el modelo de dominio . –

+1

Esto es exactamente correcto. NHibernate es perfecto para usar con la arquitectura de cebolla. Consulte http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=onion+architecture. – jason

Cuestiones relacionadas