【问题标题】:Proper way of using Unit of Work with unity injection使用 Unit of Work 与统一注入的正确方法
【发布时间】:2011-03-07 17:18:00
【问题描述】:

我正在使用带有 POCO 类的统一实体框架 4、用于 DAL 的存储库模式和用于业务逻辑控制的服务。 我还想使用工作单元,这样我就可以将我在不同服务上执行的 CRUD 操作打包在一起,然后一起提交。

我的问题是使用 Microsoft Unity 将工作单元机制注入我的应用程序的正确方法是什么? 我知道我可以将 IUnitOfWork 与适当服务的构造函数上的存储库放在一起,然后如果指定了 Unity 映射,它将自动启动适当的实例,但是这样我不会传递全局工作单元而是创建一个每个级别上的新实例,这不是一个聪明的方法(实际上存储库甚至在服务之前启动)。

我错过了什么? (附件是我现在编写的服务及其存储库的构造函数代码)。

你也明白我可以使用 Unity 的 ParameterOverrides 方法获取工作单元的一些全局实例(比如说从我的 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();
    }
}

【问题讨论】:

  • 检查这个:stackoverflow.com/questions/5187562/… 它讨论了如何在 Unity 中使用生命周期管理器。如果您在理解某些内容时遇到问题,请将其添加到您的问题中。目前我不知道您如何解决服务问题。
  • 萨吉,这个问题你有答案了吗?

标签: asp.net entity-framework-4 dependency-injection unity-container unit-of-work


【解决方案1】:

定义一个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();
        }
    }
}

【讨论】:

    【解决方案2】:

    我认为您需要做的是定义工作单元工厂。你用你的 DI 容器注册这个工厂,每次你需要你的工作单元时,你就为这个工厂解析。然后你从工厂得到工作单元,使用它然后放手。您经常会看到您的工作单元需要在单个方法或单个类的范围内。本文讨论与实体框架相关的工作单元模式:http://msdn.microsoft.com/en-us/magazine/dd882510.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多