управление параллелизмом версий для длинной сессии.NHibernate.ASP.NET MVC - PullRequest
1 голос
/ 23 февраля 2012

1) Что является более подходящим / обычно используемым подходом для управления параллелизмом?Пессимистическая или оптимистическая блокировка?

2) Как я могу уведомить пользователя, если есть блокировка элемента или произошел откат?

3) Предположим, я добавил всю необходимую разметку (например,optimistic-locking="false" чтобы исключить свойства, которые я не хочу участвовать в сравнении) с моей сущностью файлы сопоставления и определили свойство Version в классах сущностей для управления параллелизмом.Будет ли этого достаточно, и все вещи будут обработаны в / 1011 *.Или дополнительные модификации должны присутствовать?Например, в Repository?

public class Repository<T> : IRepository<T> where T : AbstractEntity<T>, IAggregateRoot
{
    private ISession session;

    public Repository(ISession session)
    {
        this.session = session;
    }

    public T Get(Guid id)
    {            
        return this.session.Get<T>(id);            
    }
    public IQueryable<T> Get(Expression<Func<T, Boolean>> predicate)
    {
        return this.session.Query<T>().Where(predicate);            
    }
    public IQueryable<T> Get()
    {
        return this.session.Query<T>();            
    }
    public T Load(Guid id)
    {
        return this.session.Load<T>(id);
    }
    public void Add(T entity)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Save(entity);
            transaction.Commit();
        }
    }
    public void Remove(T entity)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Delete(entity);
            transaction.Commit();
        }
    }
    public void Remove(Guid id)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Delete(this.session.Load<T>(id));
            transaction.Commit();
        }
    }
    public void Update(T entity)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Update(entity);
            transaction.Commit();
        }
    }
    public void Update(Guid id)
    {            
        using(var transaction = this.session.BeginTransaction())
        {
            this.session.Update(this.session.Load<T>(id));
            transaction.Commit();
        }
    }
}

// DI
public class DataAccessModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        this.Bind<ISessionFactory>()
            .ToMethod(c => new Configuration().Configure().BuildSessionFactory())
            .InSingletonScope();

        this.Bind<ISession>()
            .ToMethod(ctx => ctx.Kernel.TryGet<ISessionFactory>().OpenSession())
            .InRequestScope();

        this.Bind(typeof(IRepository<>)).To(typeof(Repository<>));
    }
}

я использую длинный сеанс с несколькими транзакциями.

Спасибо!

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Ваш репозиторий никогда не должен обрабатывать области транзакций.Это совершенно другое требование, и репозиторий не может знать, какие границы должна иметь транзакция.

Транзакции должны обрабатываться где-то за пределами кода инфраструктуры.Если вы используете ASP.NET MVC - фильтры действий являются подходящими (см. Реализацию в проекте Sharp Architecture).

Если используется ASP.NET, то может применяться модульная или глобальная обработка asax.

Но просто НЕ обрабатывайте это в репозитории, это очень утечка абстракции, вам нужно будет выставить границы для вызывающей стороны.

0 голосов
/ 24 февраля 2012

Вам не хватает шаблона " единица работы " здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...