gpt4 book ai didi

c# - Entity Framework - 存储库和工作单元 - 我这样做对吗?

转载 作者:行者123 更新时间:2023-11-30 20:59:33 30 4
gpt4 key购买 nike

我的仓库是这样的:

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;
}
}

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

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

最佳答案

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

  • GetList方法困惑。他们正在返回 IQueryable而不是列表。我想GetAll是更合适的名字。
  • 您无需调用 _dbSet.AsQueryable() ,因为 DbSet<T>工具 IQueryable<T> .只需返回 _dbSet .
  • 通常在通用存储库中创建一些包含相关实体以进行预加载的方法。
  • 如果您的存储库是通用的,那么您为什么要使用特定的上下文?使用 DbContext相反。
  • 你为什么要曝光 DbContext来自存储库?
  • 您正在 UoW 中创建上下文。这使得依赖注入(inject)成为不可能。
  • 设置_dbContext处置后不需要为 null。

关于c# - Entity Framework - 存储库和工作单元 - 我这样做对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15442481/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com