是否可以仅在GenericRepository中实现多租户?

时间:2013-10-31 12:24:10

标签: c# asp.net-mvc entity-framework asp.net-mvc-4

基于ASP.net MVC教程的GenericRepository模式(Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application),反对实施多租户的内容如下:

public class GenericMultiTenantRepository<TEntity> where TEntity : MultitenantEntity
{
    internal SchoolContext context;
    internal DbSet<TEntity> dbSet;
    ...
public virtual IEnumerable<TEntity> Get(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        string includeProperties = "")
    {
        IQueryable<TEntity> query = dbSet;

        if (filter != null)
        {
            query = query.Where(filter);
        }

        query = query.Where(entity => entity.TenantId == <TenantId>); /* Like this? */

        foreach (var includeProperty in includeProperties.Split
            (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty);
        }

        if (orderBy != null)
        {
            return orderBy(query).ToList();
        }
        else
        {
            return query.ToList();
        }
    }

和MultitenantEntity就是以下内容:

public class MultitenantEntity {
    public int TenantId {get;set;}
}

现在所有实体都来自MultitenantEntity,您仍然可以将整个应用程序编程为仅适用于一个租户?

我在监督什么吗?或者是否有更广泛接受的做法来实现我想要做的事情?

同样的原则也应该添加到insert方法中,但为了简洁,我省略了这些更改。

1 个答案:

答案 0 :(得分:2)

  

我在监督什么吗?

不,基本上就是这样,如果你想要一个实体只能由一个'租户'拥有。我目前正在研发一个更通用的框架,允许将权限分配给每个实体和存储库,为单个用户和用户组实现CRUD和其他权限。我找不到任何现有的付费或免费图书馆来做这件事。

请记住,在插入或更新时,您必须检查overposting / mass assignment相关实体,恶意用户可以更改发布的关键字段(如ID)。

如果不这样做,有人可以致电Update(TEntity entity),其中entity可由当前登录的用户写入,但entity.RelatedEntity实际上属于其他人。

当然,在您的情况下,您只想抽象出与多租户相关的代码,以便Get()成为:

public override virtual IEnumerable<TEntity> Get(
    Expression<Func<TEntity, bool>> filter = null,
    Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
    string includeProperties = "")
{
    return base.Get(filter, orderBy, includeProperties)
               .Where(entity => entity.TenantId == _tenantID);
}