2012-02-23 2 views
1

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

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

3) Предположим, я добавил всю необходимую разметку (например, optimistic-locking="false", чтобы исключить свойства я не хочу быть вовлеченным в сравнении) на мой объект отображения файлов и определили Version свойство на сущностей классов для обработки контроль параллелизма. Этого будет достаточно, и весь материал будет обработан в/NHibernate. Должны ли присутствовать дополнительные модификации? Например, в 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<>)); 
    } 
} 

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

Спасибо!

ответ

1

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

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

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

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

+0

Хорошо. Я сделал поиск по тому, почему это плохая практика, чтобы разоблачить транзакции в репозитории. Итак, теперь у меня есть два вопроса. Я хочу, чтобы моя схема «сеанс за запрос» оставалась. Какие проблемы следует учитывать, если логика остается прежней? И второе. Существует множество подходов для реализации обработки транзакций на основе фильтра действий или чего-то еще. Но большинство из них являются спорными и не совсем понятными. Не могли бы вы затем дать мне/указать последовательное объяснение. Большое спасибо! – lexeme

+0

Просто посмотрите здесь https://github.com/sharparchitecture/Sharp-Architecture/tree/master/Solutions/SharpArch.NHibernate. Возможно, это лучшее направление. – Sly

+0

Я об этом позаботился. Благодарю. Но мне все еще любопытно в вопросах, которые предоставляются с решением, которое у меня есть. С какими проблемами я столкнусь, например, неправильная запись в базу данных или что-то еще? Не могли бы вы помочь мне? Я спрашиваю, потому что я почти построил проект, возможно, с ошибкой в ​​реализации стратегии доступа к данным. – lexeme

Смежные вопросы