2012-05-30 10 views
6

Estoy tratando de comenzar en el mundo "DDD con C#". Uso NHibernate como mi herramienta ORM, tratando de desarrollar un modelo PI (persistencia ignorante). Sin embargo, en algunas de mis entidades (que están siendo representadas como POCOS), tengo reglas de negocio en el establecimiento de mis propiedades. Por ejemplo, tengo una entidad de "Usuario" que tiene una bandera que indica si este usuario está bloqueado o no, cuando esta bandera es verdadera, un segundo campo llamado "Fecha de Bloque" debe llenarse automáticamente con la fecha actual. Todo parece muy claro y simple, pero el problema surge en el momento en que estoy recuperando usuarios que ya han persistido en la base de datos, aunque los usuarios bloqueados tendrán su actualización de "fechas bloqueadas" a la fecha actual, de acuerdo con esta lógica. Inicialmente pensé en una segunda bandera "isLoaded" que indicaría que el objeto está siendo hidratado por NHibernate y que esta lógica no se lanzaría, , sin embargo, esto no parecía PI. ¿Alguna sugerencia sobre cómo mejorar esto?Modelo de dominio con problema de diseño de Nhibernate

Respuesta

4

Puede definir la estrategia de acceso al campo en su asignación para la propiedad IsBlocked. Básicamente, le diría a NHibernate que use el campo privado subyacente (_isBlocked) en lugar de la propiedad y, por lo tanto, su lógica setter en la propiedad IsBlocked no se ejecutará.

This SO question tiene una buena respuesta a las estrategias de acceso.

Oficial NHibernate documentation.

Si está utilizando Fluido NHibernate para el mapeo, así es como se podría definir que:

Map(x => x.IsBlocked).Access.CamelCaseField(Prefix.Underscore); 
4

Además de solución para el problema Miroslavs NHibernate, yo realmente recomiendo alejarse de poner la lógica detrás de la propiedad setters, especialmente cuando otros campos necesitan ser cambiados.

public void Block() 
{ 
    _isBlocked = true; 
    _blockedDate = DateTime.Now; 
} 

Ver respuestas a this question por qué.

+0

+1 de esta recomendación –

Cuestiones relacionadas