Jov*_*SFT 5 session dependency-injection asp.net-core
我需要使用IServiceProvider在ASP.NET Core 1.0中的ConfigureService方法中访问会话变量.
我有一个使用delegate/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();
}
Run Code Online (Sandbox Code Playgroud)
我的会话配置正常(我可以在控制器中获取/设置值).但是,我无法从IServiceProvider获取服务.我找不到应该为GetServices方法提供什么类型来获取将找到会话的服务.
Microsoft.AspNetCore.Session.DistributedSession实现ISession,但未ISession在DI系统中注册,因此您无法直接解决它.
但正如您在此处所看到的,它ISession是在执行Session中间件期间创建的,并放入功能列表中(中间件可以放置可在请求期间稍后使用的数据的列表).在会话中间件调用期间,该HttpContext.Session属性将从ISessionFeature集合中填充.所以你可以从中访问它HttpContext.
您需要注册IHttpContextAccessor与
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)
并解决此问题,然后访问它的HttpContext.Session属性.你必须做好登记,因为IHttpContextAccessor默认情况下不会因为RC2了注册,本公告所提到这里对GitHub的问题跟踪器.