Добрый день!
В процессе рефакторинга текущих подходов и архитектуры системы (N-Layer = DAL (Entities, Repositories, UnitOfWork) <-> BLL (DTO, Services) <-> Presentation (ASP.NET MVC / ASP.NET Web API 2)) было решено перейти к следующей реализации слоя бизнес-логики (Services)
Базовый сервис
public abstract class BaseService : IService
{
private readonly ILogger _logger;
private readonly IUnitOfWorkFactory _uowFactory;
public BaseUnitOfWorkService(ILogger logger, IUnitOfWorkFactory uowFactory)
{
_logger = logger;
_uowFactory = uowFactory;
}
}
Сервис уведомлений
public class NotificationService : BaseService, INotificationService
{
public NotificationService(ILogger logger,
IUnitOfWorkFactory uowFactory,
IRepository<Notification> notificationRepository) : base(logger, uowFactory)
{
_notificationRepository = notificationRepository;
}
public void CreateNotification(NotificationDTO notification)
{
using(IUnitOfWork uow = uowFactory.Create())
{
_notificationRepository.Insert(notification);
uow.Commit();
}
}
}
Сервис тикетов
public class TicketService : BaseService, ITicketService
{
private readonly ITicketRepository _ticketRepository;
private readonly INotificationService _notificationService;
public TicketService(ILogger logger,
IUnitOfWorkFactory uowFactory,
ITicketRepository ticketRepository,
INotificationService notificationService) : base(logger, uowFactory)
{
_notificationService = notificationService;
_ticketRepository = ticketRepository;
}
public TicketDTO CreateTicket(TicketDTO ticket)
{
using(IUnitOfWork uow = _uowFactory.Create())
{
try
{
_ticketRepository.Insert(ticketEntity);
_notificationService.CreateNotification(new NotificationDTO());
// uow.Commit() внутри метода CreateNotification не должен выполнить SaveChanges(),
// так как всё выполняется в рамках одной транзакции
// А строчкой ниже выполнится общая транзакция
uow.Commit();
}
catch(Exception ex)
{
uow.Rollback();
}
}
}
}
Но возник вопрос - как реализовать UnitOfWorkFactory применительно к Entity Framework 6 вместе с Repository и UnitOfWork?
То есть как получать в репозиториях текущий UnitOfWork (тот, который используется фабрикой в текущий момент)?
Просьба показать краткий пример реализации, или прислать ссылку на такой пример.
Подобный подход описан в блоге
Александра Бындю, но скачать исходный код там уже, к сожалению, нельзя(
Заранее спасибо за любую помощь в этом вопросе!