Я изучаю шаблон UoW и у меня есть 3 вопроса.
public class UnitofWork : unitofwork.Models.IUnitofWork
{
private readonly ITransaction transaction;
private readonly ISession session;
public UnitofWork(ISession session)
{
this.session = session;
session.FlushMode = FlushMode.Auto;
transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);
}
public void Commit()
{
if (!transaction.IsActive)
{
throw new InvalidOperationException("Oops! We don't have an active transaction");
}
transaction.Commit();
}
public void Rollback()
{
if (transaction.IsActive)
{
transaction.Rollback();
}
}
public void Dispose()
{
if (session.IsOpen)
{
session.Close();
}
}
}
Я только что узнал об "IsolationLevels", и мне интересно, какой из них вы должны использовать? Что произойдет, если вам нужно использовать несколько «IsolationLevels» для разных транзакций? Как бы вы сконфигурировали свой UoW (вы бы сделали несколько реализаций вышеупомянутого класса?)
Иначе как Rollback and Commit обычно входит в UoW? Я знаю, что такие вещи, как создание, обновление, получение запросов, попадут в репозиторий (если вы используете этот шаблон). Так что еще вы можете увидеть в нем?
Я скопировал это UoW с какого-то сайта (у меня его сейчас нет) и внес изменения в соответствии с моими потребностями (например, я использую ninject, поэтому я чувствовал, что нет смысла принимать UoW в фабрике сессий и открытии сессии в UoW)
Мне интересно, для чего нужен Dispose? Я видел это несколько раз раньше (некоторые, кажется, реализуют IDispose).
На самом деле я не использую его сейчас ни в одном из моих кодов. Мне интересно, если это необходимо для меня, как я уже упоминал, я использую ninject, и он обрабатывает сессию (т.е. закрывает ее, как только я закончу)
public void Dispose()
{
if (session.IsOpen)
{
session.Close();
}
}
Редактировать
Я добавил это в свою единицу работы
public void BeginTransaction()
{
transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);
}
public void BeginTransaction(IsolationLevel level)
{
transaction = session.BeginTransaction(level);
}
Я убрал его из конструктора