1

基于 ASP.net MVC 教程的 GenericRepository 模式(在 ASP.NET MVC 应用程序中实现存储库和工作单元模式),反对实现多租户的内容如下:

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 方法中,但为简洁起见,我省略了这些更改。

4

1 回答 1

2

我在监督什么吗?

不,基本上就是这样,如果您希望一个实体仅由一个“租户”拥有。我目前正在研发一个更通用的框架,允许将权限分配给每个实体和存储库,为单个用户和用户组实现 CRUD 和其他权限。我找不到任何现有的付费或免费图书馆来执行此操作。

请记住,在插入或更新时,您必须检查相关实体的过度发布/批量分配,恶意用户可以在其中更改发布的关键字段(如 ID)。

如果您不这样做,则有人可以调用当前登录用户可写的位置,但Update(TEntity entity)实际上属于其他人的位置。entityentity.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);
}
于 2013-10-31T12:31:39.740 回答