我使用Unity,实体框架4和POCO类,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();
}
}
答案 0 :(得分:3)
定义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();
}
}
}
答案 1 :(得分:0)
我认为您需要做的是定义工作单元工厂。您在DI容器中注册此工厂,并在每次需要工作单元时解决此工厂问题。然后你从工厂获得工作单元,使用它并放手。您经常会看到您需要在单一方法或单一类别范围内的工作单元。本文讨论与实体框架相关的工作单元模式:http://msdn.microsoft.com/en-us/magazine/dd882510.aspx