Я использую unity, entity framework 4 с классами POCO, шаблон репозитория для DAL и службы для управления Business Logic. Я также хочу использовать Unit of Work, чтобы я мог объединить операции CRUD, которые я выполняю для разных служб, а затем фиксировать их все вместе.
У меня вопрос: как правильно внедрить механизм Unit Of Work в мое приложение с помощью Microsoft Unity? Я понимаю, что могу поместить IUnitOfWork вместе с репозиторием в конструктор соответствующей службы, а затем, если указано отображение Unity, оно автоматически инициирует правильные экземпляры, но таким образом я не передаю глобальную единицу работы, а скорее создаю новый экземпляр на каждом уровне, что не может быть разумным способом сделать это (на самом деле репозиторий запускается еще до службы).
Что мне не хватает? (Прилагается код конструктора сервиса и его репозитория, который я написал сейчас).
U также понимает, что я могу использовать метод Unity ParameterOverrides, чтобы взять некоторый глобальный экземпляр Unit of Work (скажем, из моего файла aspx.cs) и передать его в службу, а затем в репозиторий. Но это кажется немного хромым. Это мой единственный вариант?
Спасибо
public class GenericRepository<T> : IUnitOfWorkRepository, IGenericRepository<T> where T : BaseEntity, IAggregateRoot
{
private IUnitOfWork _uow;
/// <summary>
/// Returns the active object context
/// </summary>
private ObjectContext ObjectContext
{
get
{
return ObjectContextManager.GetObjectContext();
}
}
public GenericRepository(IUnitOfWork uow)
{
_uow = uow;
}
//blahhhh...
public void Add(T entity)
{
_uow.RegisterNew(entity, this);
}
public void Delete(T entity)
{
_uow.RegisterRemoved(entity, this);
}
//.....blah blah....
public void PersistCreationOf(IAggregateRoot entity)
{
this.ObjectContext.AddObject(GetEntitySetName(), entity);
}
public void PersistUpdateOf(IAggregateRoot entity)
{
// Do nothing as EF tracks changes
}
public void PersistDeletionOf(IAggregateRoot entity)
{
this.ObjectContext.DeleteObject(entity);
}
}
public class CategoryRepository : GenericRepository<XComSolutions.FB.Domain.Model.Entities.Category>, ICategoryRepository
{
public CategoryRepository(IUnitOfWork uow)
: base(uow)
{ }
}
public class CategoryService : ICategoryService
{
public int myID {get; set;}
private ICategoryRepository _categoryRepository;
private IUnitOfWork _uow;
public CategoryService(ICategoryRepository categoryRepository,
IUnitOfWork uow)
{
_categoryRepository = categoryRepository;
_uow = uow;
}
public List<Category> GetAll()
{
return _categoryRepository.GetAll();
}
}