gpt4 book ai didi

C# 存储库设计问题

转载 作者:行者123 更新时间:2023-11-30 13:28:45 26 4
gpt4 key购买 nike

我正在为 MVC 2 Web 应用程序编写 EF4 数据层,我需要有关选择继承类与抽象基类的建议。我的存储库按照“通用存储库”结构运行良好,但现在我想添加“审计”功能,每次执行 CRUD 操作时都会进行记录。

这是我到目前为止一直在使用的契约(Contract):

public interface IRepository<T>
{
void Create(T entity);
void Update(T entity);
void Delete(Func<T, bool> predicate);
T Get(Func<T, bool> predicate);
IQueryable<T> Query();
}

我的 repo 。实现看起来像这样:

sealed class EFRepository<TEntity> : IRepository<TEntity>
where TEntity : EntityObject
{
ObjectContext _context;
ObjectSet<TEntity> _entitySet;

public EFRepository(ObjectContext context)
{
_context = context;
_entitySet = _context.CreateObjectSet<TEntity>();
}

public void Create(TEntity entity)
{
_entitySet.AddObject(entity);
_context.SaveChanges();
}

public void Update(TEntity entity)
{
_entitySet.UpdateObject(entity);
_context.SaveChanges();
}

public void Delete(Func<TEntity, bool> predicate)
{
TEntity entity = _entitySet.Single(predicate);
_entitySet.DeleteObject(entity);
_context.SaveChanges();
}

public TEntity Get(Func<TEntity, bool> predicate)
{
return _entitySet.SingleOrDefault(predicate);
}

public IQueryable<TEntity> Query()
{
return _entitySet;
}
}

我想创建一个 AuditableRepository<T> 的概念.我应该这样创建它吗:

interface IAuditable<T>
interface IRepository<T>
AuditableRepository<T> : IRepository<T>, IAuditable<T>
EFRepository<T> : AuditableRepository<T>

还是这样更好:

interface IAuditable<T>
interface IRepository<T>
EFRepository<T> : IRepository<T>, IAuditable<T>

甚至:

interface IAuditable<T>
interface IRepository<T>
AuditableRepository<T> : IRepository<T>, IAuditable<T>
EFRepository<T> : IRepository<T>
AuditableEFRepository<T> : AuditableRepository<T>

并非我的所有 EFRepositories 都需要审核。我应该如何进行?

最佳答案

这是另一种可能性(使用 Decorator 对象向现有存储库添加附加功能):

public sealed class Auditor<T> : IRepository<T>
{
private readonly IRepository<T> _repository;

public Auditor(IRepository<T> repository)
{
_repository = repository;
}

public void Create(T entity)
{
//Auditing here...
_repository.Create(entity);
}

//And so on for other methods...
}

使用 Decorator 添加附加功能的优势在于,它避免了组合爆炸式增长,当您考虑某些存储库进行审核时,有些没有,有些使用 EF,有些则没有。随着每一项可能适用或可能不适用的新功能的出现,这种情况会逐渐变得更糟,通常最终会退化为配置标志和困惑的内部分支。

关于C# 存储库设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4180125/

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