C#: Реализация UnitOfWork factory?

Добрый день!

В процессе рефакторинга текущих подходов и архитектуры системы (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 (тот, который используется фабрикой в текущий момент)?

Просьба показать краткий пример реализации, или прислать ссылку на такой пример.

Подобный подход описан в блоге Александра Бындю, но скачать исходный код там уже, к сожалению, нельзя(

Заранее спасибо за любую помощь в этом вопросе!
  • Вопрос задан
  • 1851 просмотр
Пригласить эксперта
Ответы на вопрос 1
1) https://habrahabr.ru/post/321050/
2) https://habrahabr.ru/post/276593/
3) Посмотреть примеры кода на https://code.msdn.microsoft.com/
- Unit of Work & Repositories Framework
- KiksApp Enterprise application architecture Onion
4) Pluralsight
- Become a Full-stack .NET Developer - Advanced Topics
- Become a Full-stack .NET Developer - Architecture and Testing
- Become a Full-stack .NET Developer - Fundamentals
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы