2

我的存储库如下所示:

public class SqlRepository<T> : IRepository<T> where T : class
{
    private ExchangeSiteContext _dbContext;
    private DbSet<T> _dbSet;

    #region [Constructor]
    public SqlRepository(ExchangeSiteContext context)
    {
        _dbContext = context;
        _dbSet = context.Set<T>();
    }
    #endregion

    /// <summary>
    /// Gets the DbContext of the repository
    /// </summary>
    public ExchangeSiteContext DbContext
    {
        get
        {
            return this._dbContext;
        }
    }

    /// <summary>
    /// Get a list of entities
    /// </summary>
    /// <returns>List of type T entities</returns>
    public IQueryable<T> GetList()
    {
        return this._dbSet.AsQueryable();
    }

    /// <summary>
    /// Get a list of entities by a predicate
    /// </summary>
    /// <param name="predicate">The predicate</param>
    /// <returns>IQueryable of T</returns>
    public IQueryable<T> GetList(Expression<Func<T, bool>> predicate)
    {
        return this._dbSet.Where(predicate).AsQueryable();
    }

    ...
    ...
}

我的工作单元是这样的:

public class SqlUnitOfWork : IUnitOfWork, IDisposable
{
    #region [Private Variables]
    private ExchangeSiteContext _dbContext;
    private BicycleSellerListingRepository _bicycleSellerListingRepository;
    private UserProfileRepository _userProfileRepository;
    #endregion

    #region [Constructor]
    public SqlUnitOfWork()
    {
        this._dbContext = new ExchangeSiteContext();
    }
    #endregion

    #region [Custom Repositories]
    public BicycleSellerListingRepository BicycleSellerListingRepository
    {
        get
        {
            if (this._bicycleSellerListingRepository == null)
                this._bicycleSellerListingRepository = new BicycleSellerListingRepository(this._dbContext);

            return this._bicycleSellerListingRepository;
        }
    }

    public UserProfileRepository UserProfileRepository
    {
        get
        {
            if (this._userProfileRepository == null)
                this._userProfileRepository = new UserProfileRepository(this._dbContext);

            return this._userProfileRepository;
        }
    }
    #endregion

    ///
    /// Generic repository
    ///
    public SqlRepository<T> GenericRepository<T>() where T : class
    {
        return new SqlRepository<T>(this._dbContext);
    }

    public void Commit()
    {
        this._dbContext.SaveChanges();
    }

    public void Dispose()
    {
        this._dbContext.Dispose();
        this._dbContext = null;
    }
}

我的存储库都是通用的。我的工作单元有一些自定义存储库,主要用于我无法执行通用操作的情况。

我的问题是,这看起来对吗?我以前从未创建过存储库或工作单元。这似乎工作得很好,但我不确定我是否忽略了一些东西。

4

2 回答 2

3

存储库和 UoW 没有单一的正确实现(就我而言,我更喜欢 UoW 是 DbContext 的简单包装器,它被传递给存储库)。但这是我在您的实施中看到的一些问题:

  • GetList方法令人困惑。他们正在返回IQueryable而不是列表。我认为GetAll是更合适的名字。
  • 您不需要调用_dbSet.AsQueryable(),因为DbSet<T>实现IQueryable<T>. 简单地返回_dbSet
  • 通常在通用存储库中创建一些包含相关实体以进行预加载的方法。
  • 如果您的存储库是通用的,那么您为什么要使用特定的上下文?改为使用DbContext
  • 为什么DbContext要从存储库中公开?
  • 您正在 UoW 中创建上下文。这使得依赖注入不可能。
  • _dbContext处置后无需设置为 null。
于 2013-03-15T21:44:58.567 回答
1

工作单元和存储库模式的实现仍然是开发人员界激烈争论的主题,但是在阅读了这么多相关内容之后,我可以给你一些我收集到的指导方针:

  • 不要过度使用泛型,如果你真的需要一个泛型存储库,那么只将它们真正共享的方法放在那里,如果你能一起避免这一切,我会更好。
  • 永远不要使用基于表达式树进行过滤的方法。
  • 我可以给你其他想法,但我想引导你看一篇我写的关于这个的文章[不是因为它是我的,我真的很努力地工作],如果你愿意,你可以在这里查看
于 2013-03-15T22:17:02.300 回答