2013-07-11 21 views
5

Ekleme/güncelleştirme/silme işlemlerinde değişiklik izleme alanlarını otomatik olarak güncelleştirmeleri için UserAuthSession nesnesinin geçerli örneğini (ServiceStack'ın AuthUserSession türetilmiş) veri erişim havuzlarına enjekte etmenin doğru yolunu bulmaya çalışıyorum.ServiceStack AuthSession'ı depo sınıflarıma nasıl enjekte edebilirim?

Ben bir no-beyin olurdu benim hizmet kodunda newing-up depoları olsaydı, tıpkı olacaktır:

var repo = new MyRepository(SessionAs<UserAuthSession>()); 

Ancak, benim depoları hizmetlerine otomatik kablolu (enjekte) vardır, Service sınıf için ServiceStack koduna bakarak Şimdi

public class AppHost : AppHostBase 
{ 
    public override void Configure(Container container) 
    { 
     container.Register<ICacheClient>(new MemoryCacheClient()); 
     container.Register<IRepository>(c => 
     { 
      return new MyRepository(**?????**); <-- resolve and pass UserAuthSession 
     } 
    } 
} 

,:

yüzden UserAuthSession, örneğin IOC konteyner ile deponun kayıt için tanımlanan lambda bir yerden yakaladı zorundadır
private object userSession; 
    protected virtual TUserSession SessionAs<TUserSession>() 
    { 
     if (userSession == null) 
     { 
      userSession = TryResolve<TUserSession>(); //Easier to mock 
      if (userSession == null) 
       userSession = Cache.SessionAs<TUserSession>(Request, Response); 
     } 
     return (TUserSession)userSession; 
    } 

Ben şimdiki Request ve Response dayalı önbelleğe oturumu arar olduğunu görebilirsiniz, ancak bu lambda bana kullanılamaz.

Çözüm nedir? Yoksa problemi tamamen yanlış bir açıdan ele alıyorum mı?

+0

Ben 'JsonServiceClient' kullanarak kodumu test ediyorum belirtmeyi unuttum DEĞİL doğrudan hizmet yöntemlerini çağırarak. Bu yüzden, HttpContext.Current' lambda'da bulunmayı bekliyordum, ama her zaman boş. –

cevap

6

numaralı cevabın cevabını, istekte bulunan istekte bulunan Items sözlüğünde ServiceStack.Common.HostContext sözlüğünde saklayan oturumu saklayan another StackOverflow post cevabı bulundu. .

Benim AppHost.Configure() şimdi aşağıdaki kodu vardır:

// Add a request filter storing the current session in HostContext to be 
// accessible from anywhere within the scope of the current request. 
RequestFilters.Add((httpReq, httpRes, requestDTO) => 
{ 
    var session = httpReq.GetSession(); 
    HostContext.Instance.Items.Add(Constants.UserSessionKey, session); 
}); 

// Make UserAuthSession resolvable from HostContext.Instance.Items. 
container.Register<UserAuthSession>(c => 
{ 
    return HostContext.Instance.Items[Constants.UserSessionKey] as UserAuthSession; 
}); 

// Wire up the repository. 
container.Register<IRepository>(c => 
{ 
    return new MyRepository(c.Resolve<UserAuthSession>()); 
}); 
+0

harika ama işleri tekrar seansa nasıl kaydediyorsunuz? – fractal

+0

Seansa bir şey kaydetmeyi umursamıyorum, bu durum benim durumumda, veriyi değiştirmekle ilgili kullanıcının kimliğini bilmem gerektiğinde, tek yönlü bir yoldur. –