簡體   English   中英

我可以使用全局過濾器處理不同的多租戶嗎?

[英]Can I handle different multi-tenancy with a global filter?

我有一個實現成員身份的asp.net mvc應用程序。 因此,用戶必須登錄。每個用戶都屬於一個組織(多租戶)。

我將如何全局處理組織參數? 我當時認為這對於全局過濾器可能是一件好事,因為對於給定的組織,所有數據都需要過濾。 並且該組織與用戶名關聯,但不在同一表中。

例如我有這樣的索引動作

public ActionResult Index()
{
var result = _repository.GetListByOrganisation(organisation);
return View(result);
}

我正在考慮具有一個全局屬性,該屬性根據給定的用戶名查詢數據庫中的組織。 由於我的控制器已經包含authorize屬性,因此我具有用戶名。 最好緩存組織(會話,controllercontext),而不是在每次請求時都從db查詢組織。

這是實現這種方式的一種方法嗎? 還是還有其他更好的方法? 以及如何通過過濾器在controller / controllercontext上設置屬性?

因此,對此的任何想法以及評論都是很棒的...

我會通過DI來做到這一點。

您可以使用第三方DI容器或您自己的代碼。 無論哪種方式,您都希望基於每個請求設置組織ID。

因此,您將創建一個工作單元並將其注入到控制器中。 為了簡單起見,我們假設您的工作單元是示例代碼中的_repository字段,即使大多數現實世界中的應用程序更為復雜。

您向控制器添加構造函數參數:

public FooController(IFooRepository repository)
{
    this._repository = repository;
}

...以及FooRepository上的組織ID:

public class FooRepository: IFooRepository
{
    public FooRepository(long organizationId)
    {
        this._organizationId = organizationId;
    }
}

現在,在您的DI容器設置或MVC控制器工廠中,您都需要進行以下設置:

builder.Register(c => new FooRepository(GetOrgIdForCurrentUser()).As<IFooRepository>();
builder.Register(c => new FooController(c.Resolve<IFooRepository>());

也許您可以將組織嵌入到URL中,例如,如果您的路由看起來像是/ {organization} / {controller} / {action}

那么您將獲得如下網址

  • / bigorg / products / list
  • / smallorg / products / list

然后您將在控制器中通過方法的參數或通過RouteData對象接收組織。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM