2013-10-31 68 views
1

基於ASP.net MVC教程的GenericRepository模式(Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application),對實現多租戶的什麼東西在說話如下:單獨在GenericRepository中實現多租戶可以嗎?

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,您仍然可以編寫整個應用程序,就好像它只針對一個租戶?

我在監督什麼嗎?還是有更廣泛接受的做法來實現我想要做的事情?

插入方法也應該添加相同的原則,但爲了簡潔,我省略了這些更改。

回答

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); 
} 
+0

我明白了,非常感謝! – senic

+0

嗨CodeCaster - 我試圖實現類似的東西,但我遇到了虛擬屬性的困難。如果你有一分鐘​​,你會介意看看這個? http://stackoverflow.com/questions/19826316/virtual-navigation-properties-and-multi-tenancy – RobVious

相關問題