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<>));
}
}
Я использую длинную сессию с несколькими транзакциями.
Спасибо!
Хорошо. Я сделал поиск по тому, почему это плохая практика, чтобы разоблачить транзакции в репозитории. Итак, теперь у меня есть два вопроса. Я хочу, чтобы моя схема «сеанс за запрос» оставалась. Какие проблемы следует учитывать, если логика остается прежней? И второе. Существует множество подходов для реализации обработки транзакций на основе фильтра действий или чего-то еще. Но большинство из них являются спорными и не совсем понятными. Не могли бы вы затем дать мне/указать последовательное объяснение. Большое спасибо! – lexeme
Просто посмотрите здесь https://github.com/sharparchitecture/Sharp-Architecture/tree/master/Solutions/SharpArch.NHibernate. Возможно, это лучшее направление. – Sly
Я об этом позаботился. Благодарю. Но мне все еще любопытно в вопросах, которые предоставляются с решением, которое у меня есть. С какими проблемами я столкнусь, например, неправильная запись в базу данных или что-то еще? Не могли бы вы помочь мне? Я спрашиваю, потому что я почти построил проект, возможно, с ошибкой в реализации стратегии доступа к данным. – lexeme