2013-06-25 24 views
3

我是新來ServiceStack,所以這可能是一個noob問題:在ServiceStack/MVC4非控制器類訪問IAuthSession

我正在使用ServiceStack的ASP.NET應用程序MVC4和我試圖找出從我的MVC4控制器派生自ServiceStackController的類(EF上下文或PetaPoco數據庫)中獲取當前IAuthSession的方法。

有問題的類在Funq中使用ReuseScope.Request作用域(即基於每個HTTP請求)註冊,理想情況下我希望每個實例都使用當前的IAuthSession自動裝配,使用構造函數參數或公共屬性。

我該怎麼做?


UPDATE

一些挖後,我來到了我的想法可能會奏效。

在我AppHost.Configure我註冊,從目前的請求返回會話的拉姆達:

container.Register<IAuthSession>(c => 
    HttpContext.Current.Request.ToRequest().GetSession()); 

另外:

container.RegisterAutoWired<EFCatalogDb>(); 

其中EFCatalogDb是需要IAuthSession作爲一個構造函數參數我EF方面:

public class EFCatalogDb : DbContext 
{ 
    public EFCatalogDb(IAuthSession session) : base() 
    { } 
    // ...etc.... 
} 

不幸的是,當我可以測試這個解決方法時,我不在我的開發中,所以必須問問別人是否有意義。

+0

找到東西聽起來很相似,我想要做的,但沒有真正的答案有: https://groups.google.com/forum/#!topic/servicestack/jnX8UwRWN8A –

回答

1

我的第一個建議是試圖將IAuthSession放在數據庫類之外,因爲這會在ServiceStack上創建一個似乎不必要的依賴項。

這就是說,我認爲你可以去註冊IAuthSession的路線,並讓容器自動注入IAuthSession。更好的方法可能是圍繞IAuthSession創建自己的「包裝類」,並將其注入到數據庫類中。那將會打破對ServiceStack的依賴。

如果您有沒有問題,保持對ServiceStack依賴另一種可能性是使用SessionFeature類做這樣的事情

var key = SessionFeature.GetSessionKey(); 
authSession = AppHost.Resolve<ICacheClient>().Get<IAuthSession>(key); 
+0

謝謝,我不知道SessionFeature中存在這樣的功能。 我不介意在DAL中對ServiceStack有額外的依賴關係,因爲我已經將它用於日誌記錄。 –

+0

當我試圖實現你的建議時,我得到了這個: 'System.NotImplementedException:只支持可通過單例訪問的ASP.NET請求。 因爲SessionFeature.GetSessionId()需要一個IHttpRequest包裝器或HttpContext.Current,所以出錯,後者由於某種原因是空的,儘管我使用JsonServiceClient來調用我的服務。 任何想法爲什麼我的'HttpContext'丟失? –

+0

也許您需要添加SessionFeature插件 - https://github.com/ServiceStack/ServiceStack/wiki/Sessions – paaschpa