Правильный способ использования Unit of Work с инъекцией единства

Я использую 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();
    }
}

comment
Проверьте это: stackoverflow.com/questions/5187562/ В нем обсуждается, как использовать менеджеры времени жизни с Unity. Если у вас возникли проблемы с пониманием чего-либо, добавьте это к своему вопросу. На данный момент я не понимаю, как вы решаете услуги.   -  person Ladislav Mrnka    schedule 07.03.2011
comment
У тебя есть ответ на этот вопрос, Саги?   -  person Blaise    schedule 30.10.2012


Ответы (2)


Определите IUnitOfWorkFactory и введите его в свои службы:

public class Service
{
    private readonly IUnitOfWorkFactory factory;

    public Service(IUnitOfWorkFactory factory)
    {
        this.factory = factory;
    }

    public void DoOperation()
    {
        using (UnitOfWork context = this.factory.CreateNew())
        {
            this.DoSomeStuff(context);
            this.DoMoreStuff(context);

            context.SubmitChanges();
        }
    }
}
person Steven    schedule 07.03.2011

Я думаю, вам нужно определить unit of work factory. Вы регистрируете эту фабрику в своем контейнере DI и принимаете решение для этой фабрики каждый раз, когда вам нужна ваша единица работы. Затем вы получаете единицу работы с завода, работаете с ней и отпускаете ее. Вы часто будете видеть, что вам нужна ваша единица работы в рамках одного метода или одного класса. В этой статье обсуждается шаблон «Единица работы» в связи с Entity Framework: http://msdn.microsoft.com/en-us/magazine/dd882510.aspx

person Andrew Savinykh    schedule 11.03.2011