JWT & Простой инжектор. Установить строку подключения OnTokenValidated - PullRequest
0 голосов
/ 03 сентября 2018

Я новичок в такого рода концепциях, поэтому я как бы застрял на этом (объяснение того, к чему я стремлюсь немного ниже).

У меня есть следующий код в остальных веб-API:

UnitOfWorkProvider.cs

    public class UnitOfWorkProvider : IUnitOfWorkProvider
{
    private readonly Func<AppDbContext> getDbContext;

    public UnitOfWorkProvider(Func<AppDbContext> getDbContext)
    {
        this.getDbContext = getDbContext;
    }

    public IUnitOfWork Get()
    {
        return new AppUnitOfWork(this.getDbContext());
    }
}

SimpleInjectorConfiguration.cs

        internal static void Configure(this Container container, IConfigurationRoot configuration, IApplicationBuilder app, ILoggerFactory loggerFactory, IHttpContextAccessor httpContextAccessor, IMemoryCache memoryCache)
    {
        InitializeInjectorContainer(container, configuration, app, loggerFactory, httpContextAccessor, memoryCache);
    }

    private static void InitializeInjectorContainer(Container container, IConfigurationRoot configuration, IApplicationBuilder app, ILoggerFactory loggerFactory, IHttpContextAccessor httpContextAccessor, IMemoryCache memoryCache)
    {
        container.Register<IUnitOfWorkProvider>(() => new UnitOfWorkProvider(() => new AppDbContext(configuration.GetConnectionString("AppDbContext"))), Lifestyle.Scoped);

        ...
    }

, который вызывается на Startup.cs

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IHttpContextAccessor httpContextAccessor, IMemoryCache memoryCache)
    {
        // Configure and register Simple Injector
        simpleInjectorContainer.Configure(configuration, app, loggerFactory, httpContextAccessor, memoryCache);
        ...
    }

Для чего мне нужно - зарегистрировать IUnitOfWorkProvider следующим образом в SimpleInjectorConfiguration.cs:

container.Register<IUnitOfWorkProvider>();

и создать его позже при событии JWT OnTokenValidated, когда я получу имя базы данных из утверждений в запросе:

            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Events = new JwtBearerEvents()
                {
                    OnTokenValidated = context =>
                    {
                        // get database name from claims in request

                        // something like this to set the context. this doesnt work.
                        container.GetInstance<IUnitOfWorkProvider>(() => new UnitOfWorkProvider(() => new AppDbContext(SetConnectionString(dbNameFromClaim))), Lifestyle.Scoped);
                        return Task.CompletedTask;
                    }
                };
            });

Большое спасибо, кто может мне помочь! :)

...