How do I inject ServiceStack AuthSession into my repository classes? -


i struggling find correct way inject current instance of userauthsession object (derived servicestack's authusersession) data-access repositories in order them automatically update change tracking fields on insert/update/delete operations.

if newing-up repositories in service code no-brainer, do:

var repo = new myrepository(sessionas<userauthsession>()); 

however, repositories auto-wired (injected) services, userauthsession has grabbed somewhere in lambda defined repository's registration ioc container, e.g.:

public class apphost : apphostbase {     public override void configure(container container)     {         container.register<icacheclient>(new memorycacheclient());         container.register<irepository>(c =>         {             return new myrepository(**?????**);  <-- resolve , pass userauthsession         }     } } 

now, looking @ servicestack code service class:

    private object usersession;     protected virtual tusersession sessionas<tusersession>()     {         if (usersession == null)         {             usersession = tryresolve<tusersession>(); //easier mock             if (usersession == null)                 usersession = cache.sessionas<tusersession>(request, response);         }         return (tusersession)usersession;     } 

i can see looks cached session based on current request , response, not available me in lambda.

what's solution? or approaching problem entirely wrong angle?

found answer in another stackoverflow post stores session built request in request/thread-scoped items dictionary of servicestack.common.hostcontext. .

my apphost.configure() has following code:

// add request filter storing current session in hostcontext // accessible anywhere within scope of current request. requestfilters.add((httpreq, httpres, requestdto) => {     var session = httpreq.getsession();     hostcontext.instance.items.add(constants.usersessionkey, session); });  // make userauthsession resolvable hostcontext.instance.items. container.register<userauthsession>(c => {     return hostcontext.instance.items[constants.usersessionkey] userauthsession; });  // wire repository. container.register<irepository>(c =>  {      return new myrepository(c.resolve<userauthsession>());  }); 

Comments