Question

Je suis en train d'écrire mon Modèle de domaine que la persistance ignorant que possible . La seule chose que je fais est maintenant la propriété et marquer chaque méthode virtual, comme NHibernate exige que pour chargement paresseux.

Dans mon assemblage de modèle domaine I définir des interfaces du référentiel:

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

J'ai un ensemble données . Celui-ci fera référence NHibernate, il connaît son existence. Ceci est l'assemblage qui implémente ces interfaces référentiel:

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

et ainsi de suite.

Maintenant, je voulais mettre en œuvre une fonctionnalité de transaction à mes dépôts. Pour ce faire, je voudrais ajouter une méthode BeginTransaction sur mon interface IRepository. Cependant, je ne peux pas définir son type de retour comme NHibernate.ITransaction, car je veux garder le modèle de domaine persistance ignorant, et ne pas être obligé de faire référence à l'assemblée de NHibernate de mon ensemble modèle de domaine.

Que feriez-vous?

Voulez-vous mettre en œuvre simplement un void BeginTransaction(), un void Commit(), et une des méthodes de void RollBack() sur l'interface, et laisser la mise en œuvre du référentiel de gérer l'objet ITransaction interne ?

Ou trouver un moyen de exposer l'objet ITransaction pour permettre au client de gérer la transaction directement avec elle, au lieu d'utiliser les méthodes de dépôt?

Merci!

Autres conseils

OMI Les transactions devraient toujours commencer et se terminer dans la logique métier, en d'autres termes, la transaction devrait commencer dans la couche de service pas la couche de dépôt et le dépôt devrait s'assurer son auto dans la transaction, idéalement cela serait fait implicitement.

Maintenant, si vous utilisez NH alors si votre service et dépôts partagent la même « session » (qu'ils doivent) alors vous pouvez appeler « BeginTransaction » dans la couche de service et valider ou annuler au besoin:

Par exemple, imaginez cette méthode sur un service:

  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);
        }
     }

Comment les dépôts obtenir une référence à la même session peuvent être résolus en injectant dans les constructeurs ou en utilisant un SessionFactory pour obtenir la session en cours ...

scroll top