Установите активного арендатора в разрешенной дочерней области - PullRequest
1 голос
/ 27 июня 2019

Есть ли способ установить активного арендатора в дочерней области?Я предполагал, что это окажет глобальное влияние, но это не после дочерняя область (ILifetimeScope) была разрешена.

Зависимости

<package id="Autofac" version="4.9.2" targetFramework="net471" />
<package id="Autofac.Multitenant" version="4.2.0" targetFramework="net471" />

Воспроизведение

Воспроизведение написано с использованием консольного приложения .net framework и перечисленных выше зависимостей.

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

1 Ответ

1 голос
/ 27 июня 2019

Когда вы выбираете ILifetimeScope из области видимости, он вернется сам, а не создаст дочернюю временную область.

Эта строка:

var childScoped = mtc.Resolve<ILifetimeScope>();

следует заменить на

var childScoped = mtc.BeginLifetimeScope();

Когда создается новый LifetimeScope, модуль для нескольких арендаторов устанавливает tenantId в область. В вашем примере вы должны «изменить» tenantId до создания дочернего LifetimeScope

tenantIdentifier.TenantId = "1";
var childScoped = mtc.BeginLifetimeScope();

В таком случае разрешенное значение IReader будет тем, которое указано для арендатора.

...