这是UoW(工作单元)的有效实现吗?什么可以改进?

时间:2015-09-21 12:47:57

标签: .net design-patterns asp.net-web-api dependency-injection inversion-of-control

背景

我正在重构现有的DAL(不是我的)以使用UnitOfWork模式。我完全打破了这个构建,所以在我完成UoW之前,这是一个理论练习。但我并不完全确定我正在正确地使用UoW,所以当我不确定它是否真的有用时,我不打算实现我所拥有的。

我有什么

我有这个界面,IUnitOfWork:

public interface IUnitOfWork
{
    void AddRepository<T>(T repository);

    void AddRepositoryRange<T>(List<object> repositories);

    T GetRepositoryByType<T>();

    void Save();
}

它由以下人员实施:

public sealed class UnitOfWork  : IUnitOfWork
{
    private List<object> Repositories { get; set; }
    private CliCEntities Context { get; set; }

    public UnitOfWork(
        IEnvironmentInformationProvider environmentInformationProvider)
    {
        this.Context = new CliCEntities(environmentInformationProvider.ConnectionString);
    }

    public void AddRepository<T>(T repository)
    {
        if (this.Repositories == null)
            this.Repositories = new List<object>();

        this.Repositories.Add(repository);
    }

    public void AddRepositoryRange<T>(List<object> repositories)
    {
        if (this.Repositories == null)
            this.Repositories = new List<object>();

        this.Repositories.AddRange(repositories);
    }

    public T GetRepositoryByType<T>()
    {
        var instance = this.Repositories.Where(x => x.GetType() == typeof(T));

        return (T) instance;
    }

    public void Save()
    {
        this.Context.SaveChanges();
    }
}

IoC会像这样实例化它:

var unitOfWork = new UnitOfWork(environmentInformationProvider);

var repositoryDependencyOne = new RepositoryDependencyOne(unitOfWork);
var repositoryDependencyTwo = new RepositoryDependencyTwo(unitOfWork);

container.RegisterInstance<IRepositoryDependencyOne>(repositoryDependencyOne);
container.RegisterInstance<IRepositoryDependencyTwo>(repositoryDependencyTwo);

unitOfWork.AddRepository(repositoryDependencyOne);
unitOfWork.AddRepository(repositoryDependencyTwo);

container.RegisterInstance<IUnitOfWork>(unitOfWork);

问题

正如我所说,在这一点上,这是一个理论上的练习,我无法测试它是否真的有用,所以可能还有改进空间,但基本的概念是什么?如果没有,可以采取哪些措施来改善UoW?

谢谢!

编辑: 我使用的IoC框架是Unity。

2 个答案:

答案 0 :(得分:1)

我认为您对工作单元模式的理解有点偏差。我会从beginning开始,然后从那里开始。我使用Fowler的模式构建了自己的ORM。虽然我再也不会这样做了,但是了解这些模式是一种非常宝贵的经验。

答案 1 :(得分:0)

从概念上讲,您在工作单元中所需要的只是Add()Save()

在现实生活中,Add()由您的存储库处理。但这并不意味着UoW实现与您的存储库之间应该存在直接连接,更不用说您应该公开添加此类连接的方法。

相反,您通常拥有的是UoW实现和指向内部相同第三方更改跟踪机制的repos(例如,Entity Framework的DbContext)。它可以通过具有有限范围的DI容器注入 - 通常是根据请求在Web应用程序中注入。

public class UnitOfWork
{
  // private reference to DbContext here

  public void Save()
  {
    //...
  }
}

public class Repository
{
  // private reference to DbContext here

  public void Add()
  {
    //...
  }
}