基于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方法中,但为了简洁,我省略了这些更改。
答案 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);
}