i need resolve dbcontext based on tenant's owin value. in pipeline of method ondisconnected of hub, httpcontext not accessible.
my hub class:
public class usertrackinghub : hub { private readonly usercontext _context; public usertrackinghub(usercontext context) { ... } public override async task onconnected() { /* ok here...*/ } public override async task ondisconnected(bool stopcalled) { // never fires if use ctor injection. var connection = await _context.connections.findasync(context.connectionid); if (connection != null) { _context.connections.remove(connection); await _context.savechangesasync(); } } } here's autofac config:
public static icontainer register(iappbuilder app) { var builder = new containerbuilder(); // other registers... builder.register<usercontext>(c => { // details , conditions omitted brevity. var context = httpcontext.current; // null in ondisconnected pipeline. var owincontext = context.getowincontext(); var tenant = owincontext.environment["app.tenant"].tostring(); var connection = getconnectionstring(tenant); return new usercontext(connection); }); var container = builder.build(); var config = new hubconfiguration { resolver = new autofacdependencyresolver(container) }; app.mapsignalr(config); return container; } can me identify tenant ondisconnected in or other way?
thanks!
for interested, end injecting context factory instead context itself:
public class usertrackinghub : hub { private readonly func<string, usercontext> _contextfactory; public usertrackinghub(func<string, usercontext> contextfactory) { ... } public override async task onconnected() { ... } public override async task ondisconnected(bool stopcalled) { var tenant = context.request.cookies["app.tenant"].value; using (var context = _contextfactory.invoke(tenant)) { var connection = await context.connections.findasync(context.connectionid); if (connection != null) { context.connections.remove(connection); await context.savechangesasync(); } } } } and autofac's config:
// resolve context based on tenant builder.register<func<string, usercontext>>(c => new func<string, usercontext>(tenant => usercontextresolver.resolve(tenant)));
Comments
Post a Comment