如何使用依赖注入将参数传递给DbContext构造函数

本文关键字:DbContext 构造函数 参数传递 何使用 依赖 注入 | 更新日期: 2023-09-27 18:16:31

我正在通过要求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;
    }

在我的Controllers中,也是一样的:

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

我正在使用Unity,但并没有真正做太多配置-它只是工作。

我将从我的控制器检索tenantId。我如何从控制器>服务层>构造函数传递tenantId ?

如何使用依赖注入将参数传递给DbContext构造函数

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;
    }