asp.net - Usermanager.DbContext already disposed in Middleware -


i have below middleware in asp.net core application require usermanager injected in it. when try query user findbyidasync, following exception:

objectdisposedexception: cannot access disposed object. common cause of error disposing context resolved dependency injection , later trying use same context instance elsewhere in application. may occur calling dispose() on context, or wrapping context in using statement. if using dependency injection, should let dependency injection container take care of disposing context instances. object name: 'applicationdbcontext'. 

my middleware:

namespace myapp {     using system.threading.tasks;     using microsoft.aspnetcore.builder;     using microsoft.aspnetcore.http;     using microsoft.aspnetcore.identity;     using microsoft.extensions.options;      public class mymiddleware<tuser, trole>          tuser : class trole : class      {         private readonly requestdelegate _next;         private readonly usermanager<tuser> _usermanager;         private readonly rolemanager<trole> _rolemanager;         private readonly ioptions<identityoptions> _optionsaccessor;          public useridentitymiddleware(requestdelegate next, usermanager<tuser> usermanager,              rolemanager<trole> rolemanager, ioptions<identityoptions> optionsaccessor)         {             _next = next;             _usermanager = usermanager;             _rolemanager = rolemanager;             _optionsaccessor = optionsaccessor;         }          public async task invoke(httpcontext context)         {             var user = await _usermanager.findbyidasync("1");              var claimsprincipal = await new userclaimsprincipalfactory<tuser, trole>(                 _usermanager, _rolemanager, _optionsaccessor).createasync(user);              context.user.addidentities(claimsprincipal.identities);              await _next(context);         }     } } 

the problem happens because middleware singleton, internal dependencies need singleton, identity classes usermanager scoped per request default, how registered in startup.configureservices , dependencies usermanager such dbcontext scoped per request.

generally scoped per request want objects, if used in other places such controllers.

one solution instead of having middleware take constructor dependency on usermanager, access when needed inside invoke method, syntax this:

var usermanager = context.requestservices.getservice(usermanager<tuser>); 

that might not right syntax , have specify actual user type

the downside servicelocator pattern solve problem because usermanager per request how supposed scoped

actually think can avoid service locator pattern because invoke method injectable, can add additional dependencies method signature this:

public async task invoke(httpcontext context, usermanager<tuser> usermanager) {     ... } 

but again have provide actual type rather tuser


Comments

Popular posts from this blog

java - Jasper subreport showing only one entry from the JSON data source when embedded in the Title band -

mapreduce - Resource manager does not transit to active state from standby -

serialization - Convert Any type in scala to Array[Byte] and back -