Pregunta

Estoy tratando de escribir mi modelo de dominio como la persistencia-ignorantes como sea posible . La única cosa que estoy haciendo en este momento está marcando cada propiedad y el método virtual, como NHibernate requiere que por pereza de carga.

En mi montaje de maquetas de dominio defino algunas interfaces de repositorio:

public interface IRepository<TEntity> where TEntity : EntityBase {
    TEntity Get(int id);
    /* ... */
}
public interface IProductRepository : IRepository<Product> { ... }

Entonces tengo un conjunto de datos . Éste hará referencia a NHibernate, se sabe de su existencia. Este es el conjunto que implementa las interfaces de repositorio:

public abstract class Repository<TEntity> : IRepository<TEntity> {
    public TEntity Get(ind id) { ... }
    /* ... */
}
public class ProductRepository : Repository<Product>, IProductRepository {
    /* ... */
}

y así sucesivamente.

Ahora quería implementar una funcionalidad de transacciones a mis repositorios. Para ello, me gustaría añadir un método BeginTransaction en mi interfaz IRepository. Sin embargo, no puedo definir su tipo de retorno como NHibernate.ITransaction, ya que quiero seguir el modelo de dominio persistencia-ignorante, y no ser obligado a hacer referencia a la asamblea de NHibernate ensamblaje de mi modelo de dominio.

¿Qué hacer?

¿Le simplemente implementar un void BeginTransaction(), un void Commit(), y unos métodos void RollBack() en la interfaz, y dejar que la aplicación repositorio de gestionar internamente el objeto ITransaction

¿O encontrar una manera de exponer el objeto ITransaction para permitir que el cliente manejar la transacción directamente con él, en lugar de utilizar los métodos del repositorio?

Gracias!

¿Fue útil?

Solución

Puede echar un vistazo al Sharp Arquitectura todo lo que ya se ha puesto en práctica se habla de, incluyendo genéricos repositorios con apoyo transacciones. La solución no es que IRepository ha DbContext propiedad que encapsula las transacciones (en realidad es una interfaz). Esta es la primera de las opciones que se describe (interfaz de transacciones personalizados que oculta NHibernate). Y funciona bien.

Creo que incluso se puede reutilizar código S # arp sin importar si tiene la intención de usar el marco completo.

Otros consejos

OMI Transacciones siempre deben empezar y terminar en la lógica de negocio, en otras palabras, la transacción debe comenzar en la capa de servicio no la capa de repositorio y el repositorio debe contar con que es uno mismo en la transacción, lo ideal sería que esto se haría de manera implícita.

Ahora bien, si usted está utilizando NH continuación, si su servicio y repositorios comparten la misma 'sesión' (que debe ser) entonces se puede llamar 'BeginTransaction' en la capa de servicio y confirmar o deshacer a su conveniencia:

Por ejemplo, imaginar esto a un método en un servicio:

  public void RegisterCustomer(Customer customer)
    {
        try
        {
            using(var transaction = _session.BeginTransaction())
            {
                _customerRepository.Save(customer);
                _customerSurveyRepository.Save(customerSurvey);
                // DO What ever else you want...
                transaction.Commit();
            }
        }
        catch (Exception exn)
        {
            throw new AMException(FAILED_REGISTRATION, exn);
        }
     }

Como los repositorios de obtener una referencia a la misma sesión puede ser resuelto mediante la inyección de los constructores o usando un la SessionFactory para obtener la sesión actual ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top