【发布时间】:2022-01-06 10:18:35
【问题描述】:
考虑以下通用Repository 接口及其实现:
public interface IRepository<T>
{
IQueryable<T> FindAll(List<string> includes = null);
void Add(T entity);
void Update(T entity);
void Remove(T entity);
}
public class Repository<T> : IRepository<T> where T : class
{
protected DatabaseContext _dbContext { get; set; }
protected ILogger<Repository<T>> _logger { get; set; }
public Repository(DatabaseContext dbContext, ILogger<Repository<T>> logger)
{
_logger = logger;
_dbContext = dbContext;
}
public IQueryable<T> FindAll(List<string> includes = null)
{
try
{
IQueryable<T> items = _dbContext.Set<T>().AsNoTracking();
if (includes != null && includes.Any())
{
includes.Where(i => i != null).ToList().ForEach(i => { items = items.Include(i); });
}
return items;
}
catch (Exception e)
{
_logger.LogError(e, "{Repo} FindAll function error", typeof(Repository<T>));
return null;
}
}
public void Add(T entity)
{
try
{
_dbContext.Set<T>().Add(entity);
}
catch (Exception e)
{
_logger.LogError(e, "{Repo} Add function error", typeof(Repository<T>));
}
}
public void Update(T entity)
{
try
{
_dbContext.Set<T>().Update(entity);
}
catch (Exception e)
{
_logger.LogError(e, "{Repo} Update function error", typeof(Repository<T>));
}
}
public void Remove(T entity)
{
try
{
_dbContext.Set<T>().Remove(entity);
}
catch (Exception e)
{
_logger.LogError(e, "{Repo} Remove function error", typeof(Repository<T>));
}
}
}
为了将它与 User 这样的数据库实体一起使用,我有两个选择。
要么从通用 Repository 继承 UserRepository 实现:
public class UserRepository : Repository
{
public UserRepository(MyDbContext context) : base(context)
{
}
}
或在UserRepository 实现中创建通用IRepository 接口的实例并使用依赖注入:
public class UserRepository : IUserRepository
{
private readonly IRepository _repo;
public UserRepository(IRepository repo)
{
_repo = repo;
}
}
根据我在 ASP.NET Core 中存储库模式的有限经验,我可以使用其中任何一种并在使用数据库的 CRUD 应用程序中获得相同的结果。
我的问题是,在哪种情况下应该使用哪一个?
更新:
我仍然可以使用继承方法创建和注入IUserRepository。
public partial interface IUserRepository : IRepository
{
}
public class UserRepository : Repository, IUserRepository
{
public UserRepository(MyDbContext context) : base(context)
{
}
}
【问题讨论】:
-
我通常看到它在本文中实现 => dev.to/fullstackcodr/net-generic-repository-pattern-4gf
-
您不应该将通用存储库反模式与 EF 一起使用:您的
DbContext和DBSet<T>类型是您的“存储库”,aieeeeee。 -
@berkansasmaz “存储库模式”is an anti-pattern when used with Entity Framework。在这种情况下没有合法需要使用它。
-
要考虑的一个问题:如果您决定更改与查询执行方式相关的任何内容,哪种方法将需要您修改更少的类?与依赖注入相比,继承更有可能将代码耦合到实现细节。
标签: c# asp.net-core inheritance dependency-injection repository-pattern