2016-09-17 107 views
1

我需要使用IServiceProvider訪問ASP.NET Core 1.0中的ConfigureService方法中的會話變量。使用IServiceProvider獲取會話服務

我有一個可以從任何地方返回值的委託/ lambda表達式初始化的服務。在這種情況下,這個lambda表達式參數應該從會話中返回一次調用的值。

下面是示例代碼:

public void ConfigureServices(IServiceCollection services) 
{ 

    services.AddTransient<IMyService>(serviceProvider => 
      { 
       return new MyService(() => { 
         var session = serviceProvider.GetServices<Microsoft.AspNetCore.Session.DistributedSession>().First(); 
         return session.GetString("CompanyID"); 
        } 
       ); 
      } 

    ); 

     // Add framework services. 
     services.AddMvc(); 
     services.AddDistributedMemoryCache(); 
     services.AddSession(); 
} 

我的會話被配置細(I可以得到/設定值在控制器)。但是,我無法從IServiceProvider獲取服務。我無法找到應該向GetServices方法提供哪種類型的服務來獲取會話。

+0

你在哪裏解決服務? – Tseng

+0

此服務在控制器構造函數中提供,如CompanyController(MyService src){...} –

回答

3

Microsoft.AspNetCore.Session.DistributedSession implements ISession,但ISession沒有在DI系統上註冊,所以您不能直接解決它。

但是,如您所見,hereISession是在執行Session中間件期間創建的,並放入功能列表(中間件可以放置稍後可以在請求期間使用的數據的列表)中。 HttpContext.Session屬性從會話中間件調用期間設置的ISessionFeature填充。所以你可以從HttpContext訪問它。

你需要的IHttpContextAccessor

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

註冊和解決這個問題,然後訪問它的HttpContext.Session財產。您必須進行註冊,因爲自RC2以來不再默認註冊,正如GobHub問題跟蹤器上的此公告here中所述。

+0

謝謝,它的工作原理。添加你建議的行後:services.AddSingleton ();我可以使用:serviceProvider.GetServices ()。First()。HttpContext.Session; –

+1

其實你可以使用它的單數版本,那麼你不需要在最後調用'First()'。 'serviceProvider.GetService ()。HttpContext.Session' – Tseng