Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Autofac正确配置InstancePerTenant?_C#_Autofac_Asp.net Core 3.0 - Fatal编程技术网

C# 如何使用Autofac正确配置InstancePerTenant?

C# 如何使用Autofac正确配置InstancePerTenant?,c#,autofac,asp.net-core-3.0,C#,Autofac,Asp.net Core 3.0,我一直在尝试使用InstancePerTenant为每个租户设置组件实例。但是,InstancePerTenant在某种程度上表现得像一个SingleInstance。我的设置有问题吗 我有一个ContainerBuilder扩展,它配置了多租户相关的依赖项 public static ContainerBuilder AddMultitenancy(this ContainerBuilder builder) { builder.RegisterType<HttpContextAcc

我一直在尝试使用
InstancePerTenant
为每个租户设置组件实例。但是,
InstancePerTenant
在某种程度上表现得像一个
SingleInstance
。我的设置有问题吗

我有一个ContainerBuilder扩展,它配置了多租户相关的依赖项

public static ContainerBuilder AddMultitenancy(this ContainerBuilder builder)
{
  builder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
  builder.RegisterType<TenantStore>().As<ITenantStore>().SingleInstance();
  builder.RegisterType<TenantResolverStrategy>().As<ITenantIdentificationStrategy>().SingleInstance();
  return builder
}
TenantStore只是一个基于tenantId(主机名)从数据库解析租户实体的类

TenantsSpecific.cs和TenantsSpecificController.cs:

public class TenantSpecific
{
  public Guid Id { get; set; }

  public TenantSpecific()
  {
    this.Id = Guid.NewGuid();
  }
}

public class TenantSpecificController : ApiController
{
  private readonly ITenantSpecific tenantSpecific;

  public TenantSpecificController(ITenantSpecific tenantSpecific)
  {
    this.tenantSpecific = tenantSpecific;
  }

  [HttpGet]
  public IActionResult Get()
  {
    return Ok(tenantSpecific.Id);
  }
}
在Program.cs中

public static IHostBuilder CreateHostBuilder(string[] args)
{
  var host = Host.CreateDefaultBuilder(args)
    .UseServiceProviderFactory(new AutofacMultitenantServiceProviderFactory(Startup.ConfigureMultitenantContainer))
    .ConfigureWebHostDefaults(webHostBuilder =>
    {
      webHostBuilder
        .UseConfiguration(ConfigurationModule.GetConfiguration())
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>();
    });
  return host;
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)
{
var host=host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(新的AutofacMultitenantServiceProviderFactory(启动.ConfigureMultitenantContainer))
.ConfigureWebHostDefaults(webHostBuilder=>
{
网络主机生成器
.UseConfiguration(ConfigurationModule.GetConfiguration())
.UseKestrel()
.UseContentRoot(目录.GetCurrentDirectory())
.Useii整合()
.UseStartup();
});
返回主机;
}
当我调用and时,
TenantSpecific
的构造函数像Singleton一样只被调用一次。
tenantSpecific.Id
返回相同的值。所以我假设
InstancePerTenant
在这里不起作用


我的设置有问题吗?

如文档中所述

您应该添加对
AddAutofacMultitenantRequestServices()
的调用,以将所需中间件添加到根容器中,这是multitenancy工作所必需的

public void ConfigureServices(IServiceCollection services)
{
    // This will all go in the ROOT CONTAINER and is NOT TENANT SPECIFIC.
    services.AddMvc();
    services.AddControllers();

    // This adds the required middleware to the ROOT CONTAINER and 
    // is required for multitenancy to work.
    services.AddAutofacMultitenantRequestServices();
}
public class TenantSpecific
{
  public Guid Id { get; set; }

  public TenantSpecific()
  {
    this.Id = Guid.NewGuid();
  }
}

public class TenantSpecificController : ApiController
{
  private readonly ITenantSpecific tenantSpecific;

  public TenantSpecificController(ITenantSpecific tenantSpecific)
  {
    this.tenantSpecific = tenantSpecific;
  }

  [HttpGet]
  public IActionResult Get()
  {
    return Ok(tenantSpecific.Id);
  }
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
  var host = Host.CreateDefaultBuilder(args)
    .UseServiceProviderFactory(new AutofacMultitenantServiceProviderFactory(Startup.ConfigureMultitenantContainer))
    .ConfigureWebHostDefaults(webHostBuilder =>
    {
      webHostBuilder
        .UseConfiguration(ConfigurationModule.GetConfiguration())
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>();
    });
  return host;
}
public void ConfigureServices(IServiceCollection services)
{
    // This will all go in the ROOT CONTAINER and is NOT TENANT SPECIFIC.
    services.AddMvc();
    services.AddControllers();

    // This adds the required middleware to the ROOT CONTAINER and 
    // is required for multitenancy to work.
    services.AddAutofacMultitenantRequestServices();
}