c# - SignalR - Multitenant Dependency Injection -


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