我有一个使用Autofac.Multitenant 3.1.1的ASP.NET MVC / WebApi2应用程序。我已经设置了一个TenantIdentificationStrategy来标识租户。我还注册了一个类型为InstancePerTenant。我为每个客户都有一个租户ID,对于没有上下文的后台工作有一个特殊的ID TenantIdentificationStrategy可以正确调用,并且可以从上下文中找到ID,但是InstancePerTenant在启动时仅被无效化两次:一次用于默认的Lifetimescope(租户为null),一次用于第一个租户。如果我注销并与另一名租户登录,则将重用同一类型,而不是新的类型。我可以在容器中看到,每个tenantid创建了一个tenantlifetime范围,但没有创建4个独立的InstancePerTenant类型。 我的租户ID代码是:
public class TenantIdentificationStrategy : ITenantIdentificationStrategy
{
public bool TryIdentifyTenant(out object tenantId)
{
tenantId = null;
try
{
var context = HttpContext.Current;
if (context == null)
{
tenantId = "jobservice";
}
else
{
if (context.User?.Identity != null && context.User.Identity.IsAuthenticated)
{
var claims = context.User as ClaimsPrincipal;
tenantId = claims.FindAll(c => c.Type == "cID").FirstOrDefault()?.Value;
}
}
}
catch (HttpException)
{
// Happens at app startup in IIS 7.0
}
return tenantId != null;
}
}
在Startup.cs-Configuration()中,我有(摘要):
var builder = new ContainerBuilder();
builder.RegisterAssemblyModules(AppDomain.CurrentDomain.GetAssemblies());
var container = builder.Build();
var tenantIdentifier = new TenantIdentificationStrategy();
mtContainer = new MultitenantContainer(tenantIdentifier, container);
在单独的程序集中还有一个注册模块:
public class RegistrationModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
......
builder.RegisterType<Office365ClientService>().As<IOffice365ClientService>().InstancePerDependency();
builder.RegisterType<Office365Service>().As<IOffice365Service>().InstancePerDependency();
builder.RegisterType<Office365ClientHttpProvider>().As<IHttpProvider>().InstancePerTenant();
......
}
}
Office365ClientService依赖于IHttpProvider
我错过了什么吗?