我正在通过要求tenantId重新编写我的DbContext来支持多租户:
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;
}
我使用Unity,但实际上并没有做太多配置 - 这一切都正常。
我将从我的控制器中检索tenantId
。我如何从Controller&gt;传递tenantId? <服务层>构造
答案 0 :(得分: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;
}
就是这样。