Я уже некоторое время использую репозитории для доступа к данным, но никогда не реализовывал ничего похожего на шаблон «Единица работы».Я начал новый проект для самообразования с использованием RavenDB и ASP.NET MVC (теоретически детали должны быть тривиальными), и я ищу, чтобы найти хороший способ обернуть бизнес-транзакции ( не веб-запросы)) в их собственных единицах работы, но у меня возникли некоторые трудности при этом.
Следующий фрагмент кода - это то, что я хотел бы увидеть:
public class UserService : IUserService
{
private readonly IRepository<User> _userRepository;
private readonly IRepository<Role> _roleRepository;
public UserService(
IRepository<User> userRepository,
IRepository<Role> roleRepository)
{
_userRepository = userRepository;
_roleRepository = roleRepository;
}
public void Register(User user)
{
using (var session = UnitOfWork.Begin())
{
_userRepository.Create(user);
_roleRepository.AddToRole(user, Role.Public);
session.Commit();
}
}
}
Мой первый удар по интерфейсу единицы работы выглядит примерно так:
public interface IUnitOfWork : IDisposable
{
void Commit();
}
public class UnitOfWork : IUnitOfWork
{
private readonly IDocumentSession _session;
public UnitOfWork(IDocumentStore documentStore)
{
_session = documentStore.OpenSession("http://from:config");
}
public void Commit()
{
_session.SaveChanges();
}
public static IUnitOfWork Begin()
{
return IoC.GetInstance<IUnitOfWork>();
}
public void Dispose()
{
_session.Dispose();
}
}
Где я застрял - это доступ репозиториев к сеансу базы данных.Как я уже упоминал, я хотел бы обернуть бизнес-транзакции в свои собственные единицы;Я также не заинтересован в передаче сеанса / контекста в каждый метод, и большинство других решений, которые я видел, используют статические методы и / или хранилище в чем-то вроде веб-сеанса.Все это делает меня немного неудобным;есть ли что-то ключевое, чего мне не хватает во всей этой концепции Единицы Работы?