0

一個參數的DbContext構造我返工我的DbContext通過要求tenantId支持多租戶的中間是:如何通過使用依賴注入

public AppContext(int tenantId)    
    { 
     _tenantId = tenantId; 
    } 

之前,沒有參數。

在我的服務類,我已在上下文中實例與DI:

private readonly AppContext db; 
    private CommService _commService; 

    public AdminService(AppContext db, CommService commService) 
    { 
     this.db = db; 
     _commService = commService; 
    } 

而在我的控制器,同樣的事情:

private readonly CommService _commService; 
    public AdminController(CommService commService) { 
     _commService = commService; 
    } 

我使用的是統一的,但還沒有真的完成了很多配置 - 這一切都正常。

我將從我的控制器中檢索tenantId。我如何去從Controller> Service layer>構造函數傳遞tenantId?

+0

您應該注入'DbContextFactory',並創建一個像'factory.CreateDbContextForTenant(int tenantId)'這樣的方法。 –

回答

0

Unity無法通過tenantId,因爲這是一個變量,取決於當前的使用情況(例如任何其他條件),tenantId將在運行時確定,因此不要使其可注射。

不過,你可以製造一個工廠,並注入這個工廠。

例如:

public Interface ITenantDiscovery 
{ 
    int TenantId{get;} 
} 

public class UrlTenantDiscovery:ITenantDiscovery 
{ 
public int TenantId 
{ 
    get 
    { 
     var url = -- get current URL, ex: from HttpContext 
     var tenant = _context.Tenants.Where(a=>a.Url == url); 
     return tenant.Id; -- cache the Id for subsequent calls 
    } 
} 

在UnityConfig,註冊ITenantDiscovery及其實施UrlTenantDiscovery

更改您的AppContext接受ITenantDiscovery

public AppContext(ITenantDiscovery tenantDiscovery)    
    { 
     _tenantId = tenantDiscovery.TenantId; 
    } 

這是它的一個實例。