Я новичок в такого рода концепциях, поэтому я как бы застрял на этом (объяснение того, к чему я стремлюсь немного ниже).
У меня есть следующий код в остальных веб-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;
}
};
});
Большое спасибо, кто может мне помочь! :)