[英]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}
那么您將獲得如下網址
然后您將在控制器中通過方法的參數或通過RouteData對象接收組織。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.