具有软删除功能的通用存储库 [英] Generic Repository with Soft Delete Feature

查看:100
本文介绍了具有软删除功能的通用存储库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个通用的存储库实现。我使用asp.net mvc c#,代码第一个实体框架。



我创建了一个名为ISoftDelete的界面:

  public interface ISoftDelete 
{
bool IsDeleted {get;组; }
}

我的基本仓库中实现了Delete和GetById,如下所示:

  public virtual void Delete(T entity)
{
if(entity is ISoftDelete)
{
((ISoftDelete)实体).IsDeleted = true;
}
else
{
dbset.Remove(entity);
}
}

public virtual T GetById(long id)
{
T obj = dbset.Find(id);
if(obj is ISoftDelete)
{
if(((ISoftDelete)obj).IsDeleted)
return null;
else
return obj;
}
else
{
return obj;
}
}

现在,我有两个问题。



1)这种方法是一个很好的方法吗?任何性能相关的问题?



2)我的原始GetAll函数在基础库中是这样的:

  public virtual IEnumerable< T> GetAll()
{
return dbset.ToList();
}

如何修改它以列出IsDeleted == false的记录,当T是从ISoftDelete导出的时候?



谢谢!

解决方案

1)每当你需要知道时,检查 if(实体是ISoftDelete)似乎没有办法。如果你确定你不会在任何地方检查它可能是确定。在性能方面,如果您最小化具有 IsDeleted == true 的记录,并且从来没有从数据库获取记录,那将会更好。您可能需要派生一个新的基础存储库,它将覆盖这些方法并为ISoftDelete对象实现新的逻辑。

  public abstract class BaseRepository< T> 
{
// protected dbset;

public virtual void Delete(T entity)
{
dbset.Remove(entity);
}

public virtual T GetById(long id)
{
return dbset.Find(id);
}

public virtual IEnumerable< T> GetAll()
{
return dbset.ToList();
}
}

public abstract class SoftDeleteRepository< T> :BaseRepository< T>其中T:ISoftDelete
{
public override void Delete(T entity)
{
entity.IsDeleted = true;
}

public override T GetById(long id)
{
return(from t in dbSet
where!t.IsDeleted&& .Id == id select t)
.FirstOrDefault();
}

public override IEnumerable< T> GetAll()
{
return(from t in dbset where!t.IsDeleted select t).ToList();
}
}

public static class RepositoryFactory
{
public static BaseRepository< T> GetInstance< T>()
{
//伪代码
if(typeof(T)实现ISoftDelete)
返回T的存储库,扩展SoftDeleteRepository
返回存储库T扩展BaseRepository
}
}

2)可能会像

  return(from t in dbset where 
(t is ISoftDelete&&!(t as ISoftDelete).IsDeleted )||
!(t is ISoftDelete))
.ToList();


I have a generic repository implementation. I'm using asp.net mvc c#, code first entity framework.

I created an interface named ISoftDelete:

public interface ISoftDelete
{
    bool IsDeleted { get; set; }
}

I implemented Delete and GetById in my base repository as follows:

    public virtual void Delete(T entity)
    {
        if (entity is ISoftDelete)
        {
            ((ISoftDelete)entity).IsDeleted = true;
        }
        else
        {
            dbset.Remove(entity);
        }
    }

    public virtual T GetById(long id)
    {
        T obj = dbset.Find(id);
        if (obj is ISoftDelete)
        {
            if (((ISoftDelete)obj).IsDeleted)
                return null;
            else
                return obj;
        }
        else
        {
            return obj;
        }
    }

Now, I have 2 questions.

1) Is this approach is a good approach? Any performance related issues?

2) My original GetAll function in the base repository is like this:

    public virtual IEnumerable<T> GetAll()
    {
            return dbset.ToList();
    }

How shall I modify it in order to list records where IsDeleted == false, when T is derived from ISoftDelete?

Thank you!

解决方案

1) It does not seem ok for checking if (entity is ISoftDelete) every time you need to know it. If you are sure you are not going to check it anywhere else it may be ok. In terms of performance it would be better if you eleminate records that have IsDeleted == true and never fetch them from db. You may need to derive a new base repository which overrides these methods and implements new logics for ISoftDelete object.

public abstract class BaseRepository<T>
{
    // protected dbset;

    public virtual void Delete(T entity)
    {
        dbset.Remove(entity);
    }

    public virtual T GetById(long id)
    {
        return dbset.Find(id);
    }

    public virtual IEnumerable<T> GetAll()
    {
        return dbset.ToList();
    }
}

public abstract class SoftDeleteRepository<T> : BaseRepository<T> where T : ISoftDelete
{
    public override void Delete(T entity)
    {
         entity.IsDeleted = true;
    }

    public override T GetById(long id)
    {
        return (from t in dbSet
                where !t.IsDeleted && t.Id == id select t)
                .FirstOrDefault();
    }

    public override IEnumerable<T> GetAll()
    {
        return (from t in dbset where !t.IsDeleted select t).ToList();
    }
}

public static class RepositoryFactory
{
     public static BaseRepository<T> GetInstance<T>()
     {
          // pseudo code
          if (typeof(T) implements ISoftDelete)
               return repository of T which extends SoftDeleteRepository
          return repository of T which extends BaseRepository
     }
}

2) may be something like

 return (from t in dbset  where 
       (t is ISoftDelete && !(t as ISoftDelete).IsDeleted) || 
       !(t is ISoftDelete))
 .ToList();

这篇关于具有软删除功能的通用存储库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆