首页 > 解决方案 > Autofac多租户不解析每个租户的类型

问题描述

我有一个使用 Autofac.Multitenant 3.1.1 的 ASP.NET MVC/WebApi2 应用程序。我已经设置了一个 TenantIdentificationStrategy 来识别租户。我还将一个类型注册为 InstancePerTenant。我有每个客户的租户 ID 和不存在上下文的后台作业的特殊 ID TenantIdentificationStrategy 被正确调用并从上下文中找到 id,但 InstancePerTenant 在启动时仅实例化两次:一次用于默认生命周期范围(租户为空),第一个租户一次。如果我注销并与另一个租户一起登录,则重复使用相同的类型而不是新的类型。我可以在容器中看到,每个租户 ID 创建了一个租户生命周期范围,但不是 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

我错过了什么?

标签: autofac

解决方案


推荐阅读