首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在已解析的子作用域中设置活动的租户

在已解析的子作用域中设置活动的租户
EN

Stack Overflow用户
提问于 2019-06-26 21:11:46
回答 1查看 166关注 0票数 1

是否有一种方法可以在子作用域中设置活动租户?我以为它会产生全局影响,但在子范围(ILifetimeScope)已经解决之后就没有了。

依赖关系

代码语言:javascript
代码运行次数:0
运行
复制
<package id="Autofac" version="4.9.2" targetFramework="net471" />
<package id="Autofac.Multitenant" version="4.2.0" targetFramework="net471" />

再生产

使用.net框架控制台应用程序编写的再现和上面列出的依赖项。

代码语言:javascript
代码运行次数:0
运行
复制
using Autofac;
using Autofac.Multitenant;

namespace ConsoleAutoFacTenants
{
    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<GeneralReader>().As<IReader>().InstancePerDependency();
            var appContainer = builder.Build();

            var tenantIdentifier = new AutomationTenantStrategy();
            var mtc = new MultitenantContainer(tenantIdentifier, appContainer);

            mtc.ConfigureTenant("1", b => b.RegisterType<SpecificReader>().As<IReader>().InstancePerDependency());

            // expected
            var reader1 = mtc.Resolve<IReader>();
            System.Diagnostics.Debug.Assert(reader1.Name == "General");

            // unexpected result in debug.assert, assumed that reader2 would resolve type SpecificReader
            var childScoped = mtc.BeginLifetimeScope();
            tenantIdentifier.TenantId = "1";
            var reader2 = childScoped.Resolve<IReader>();
            System.Diagnostics.Debug.Assert(reader2.Name == "Specific");
        }
    }
    internal sealed class AutomationTenantStrategy : ITenantIdentificationStrategy
    {
        public object TenantId { get; set; }
        public bool TryIdentifyTenant(out object tenantId)
        {
            var activeTenant = this.TenantId;
            if (TenantId == null)
            {
                tenantId = null;
                return false;
            }
            tenantId = activeTenant;
            return true;
        }
    }
    public interface IReader
    {
        string Name { get; }
    }
    public sealed class GeneralReader : IReader
    {
        public string Name => "General";
    }
    public sealed class SpecificReader : IReader
    {
        public string Name => "Specific";
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-27 11:45:33

当您从一个范围解析一个ILifetimeScope时,它将返回自己,而不是创建一个子生命录像。

这一行:

代码语言:javascript
代码运行次数:0
运行
复制
var childScoped = mtc.Resolve<ILifetimeScope>();

应代之以

代码语言:javascript
代码运行次数:0
运行
复制
var childScoped = mtc.BeginLifetimeScope();

创建新LifetimeScope时,多租户模块将将tenantId设置为作用域。在您的示例中,您必须在创建子tenantId之前“更改”LifetimeScope

代码语言:javascript
代码运行次数:0
运行
复制
tenantIdentifier.TenantId = "1";
var childScoped = mtc.BeginLifetimeScope();

然后,解析的IReader将是为租户指定的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56780950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档