2008-12-04 11 views
8

Me pregunto cómo decirle a NHibernate que resuelva las dependencias en mis objetos de dominio POCO.Inyección de dependencia con objetos NHibernate

Descubrí que los métodos como CalculateOrderTax deben estar en el objeto Domain porque codifican las reglas comerciales específicas del dominio. Pero una vez que tengo dos de esos, estoy violando a SRP.

No sería ningún problema extraer esos métodos para las clases de Estrategia, pero me pregunto cómo hacer que NHibernate los cargue.

No parece una buena solución recorrer una lista de objetos en el repositorio para hacer una inyección de Dependecy basada en get/set antes de pasar el objeto a las capas superiores.

También estoy usando Castle Windsor para mi inyección de Dependencia en este momento.

Respuesta

8

He estado usando interceptores para tareas similares:

un interceptor que modifica las entidades cargadas:

public class MyInterceptor : EmptyInterceptor 
{ 
    public override bool OnLoad(object entity, object id, object[] state, string[] propertyNames, IType[] types) 
    { 
     return InjectDependencies(entity as MyEntity); 
    } 
} 

asociarlo con una sesión:

nhSessionFactory.OpenSession(myInterceptor); 

También he leído en algún lugar que habría un mejor soporte para la inyección de constructor personalizado en la próxima versión 2.1, pero parece que no puedo encontrar la referencia en este momento.

+0

Fabio (actual programador principal) explica la nueva inyección de constructor aquí: http://fabiomaulo.blogspot.com/2008/11/entities-behavior-injection.html –

+0

Esto es lo que estoy a punto de hacer, también. ¿Se puede justificar el uso del evento OnLoad en lugar del Instanciado? –

+0

Parece que Instantiate es una forma de hacer tu propia fábrica (lo que podría ser bastante bueno si quieres usar la inyección de constructor). Solo necesitaba inyectar un servicio en una clase base invalidable. –

1

Como nadie parece poder responder a su pregunta en este momento, pensé que recomendaría reestructurar su código para eliminar la necesidad de que la Orden calcule su propio impuesto.

Puede delegarlo en un OrderTaxService que toma un objeto Order y devuelve un objeto OrderValue o algo similar a lo largo de esas líneas.

Esto mantendrá la lógica en su dominio pero eliminará la necesidad de adjuntarlo a sus objetos Order.

+0

Así es como lo hago ahora mismo. Paso la orden todo el tiempo y dejo que las clases externas calculen cosas. Simplemente se siente mal porque mis objetos son a) mutables yb) Necesito transportar esos servicios todo el tiempo porque si no quiero actualizarlos desde el código de lógica de negocios. – Tigraine

+0

Se vuelve más complicado cuando hay varias estrategias para una cosa. Al igual que las órdenes con normalTaxrate se calculan de manera diferente que otros. Luego, tengo que dejar que los Servicios decidan cómo calcular los impuestos para un objeto de dominio determinado. .. – Tigraine

1

Estoy de acuerdo con Garry en que debe eliminar las dependencias de servicio de los objetos de su dominio tanto como sea posible. A veces tiene sentido, como el cifrado/descifrado. En ese caso, puede ocultarlo en la infraestructura mediante la interceptación o IUserType. Creo que esto último es favorable cuando puedes usarlo. This article muestra en detalle cómo hacerlo. Estoy haciendo esto y funciona bastante bien.

Cuestiones relacionadas