C# 在mvc core中注册DI时如何访问ISession
我在Mvc核心中为我的DI使用SimpleInjector,我有一个类在构造函数中接受ISessionC# 在mvc core中注册DI时如何访问ISession,c#,dependency-injection,asp.net-core,simple-injector,C#,Dependency Injection,Asp.net Core,Simple Injector,我在Mvc核心中为我的DI使用SimpleInjector,我有一个类在构造函数中接受ISession public sessionappadmin授权(ISession session) 我需要在StartUp.Configure方法中的DI配置中注册它,但我不知道如何获取作用域会话变量 container.Register<IAppAdminAuthorization>(() => { return new SessionAppAdminAuthorization(
public sessionappadmin授权(ISession session)
我需要在StartUp.Configure
方法中的DI配置中注册它,但我不知道如何获取作用域会话变量
container.Register<IAppAdminAuthorization>(() => {
return new SessionAppAdminAuthorization([I Need the ISession]); },
Lifestyle.Scoped);
container.Register(()=>{
返回新SessionAppAdminAuthorization([我需要ISession]);},
生活方式(范围);
ASP.NET核心的ISession
可以通过HttpContext.Session
属性访问。由于HttpContext
是运行时数据,因此会话也属于运行时数据,因此,您的SessionAppAdministration
不应直接依赖于ISession
最简单的修复方法是让SessionAppAdminAuthorization
依赖IHttpContextAccessor
,然后调用IHttpContextAccessor.HttpContext.Session
。例如:
public class SessionAppAdminAuthorization : IAppAdminAuthorization
{
private readonly IHttpContextAccessor accessor;
public SessionAppAdminAuthorization(IHttpContextAccessor accessor) {
this.accessor = accessor;
}
public void DoSomethingUseful() {
if (this.accessor.HttpContext.Session.GetBoolean("IsAdmin")) {
// ...
} else {
// ...
}
}
}
现在,您可以按如下方式进行注册:
public void ConfigureServices(IServiceCollection services)
{
// You need to register IHttpContextAccessor.
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// ...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment e, ILoggerFactory f)
{
container.RegisterSingleton(
app.ApplicationServices.GetRequiredService<IHttpContextAccessor>());
container.Register<IAppAdminAuthorization, SessionAppAdminAuthorization>();
// ...
}
注册:
public void Configure(IApplicationBuilder app, IHostingEnvironment e, ILoggerFactory f)
{
var accesr = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
container.RegisterSingleton<IUserContext>(new AspNetSessionUserContextAdapter(accesr));
container.Register<IAppAdminAuthorization, SessionAppAdminAuthorization>();
// ...
}
public void配置(IApplicationBuilder应用程序、IHostingEnvironment e、iLogger工厂)
{
var accesr=app.ApplicationServices.GetRequiredService();
RegisterSingleton(新的AspNetSessionUserContextAdapter(accesr));
container.Register();
// ...
}
这个问题缺少一些上下文。您需要描述从何处获取此ISession
变量。在启动.Configure
方法时,我更新了问题。是什么阻止您获取此ISession
变量以及什么是ISession
?请举例说明如何在没有简单注射器的情况下获得/使用此ISession
。这是NHibernate ISession吗?因为NHibernate不支持.net core@MenelaosVergis,所以请编写一个您注入的ISessionProvider
,您可以使用它来获取ISession
的实例。它是“运行时数据”,因此您不应注入该数据,而应注入可以为您提供运行时数据的内容。谢谢,正如我所看到的,SimpleInjection和Microsoft DI之间存在连接,我也将尝试实现第二个示例。你是对的,在我的LIB中包含所有这些ms内容不是很优雅。
public void Configure(IApplicationBuilder app, IHostingEnvironment e, ILoggerFactory f)
{
var accesr = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
container.RegisterSingleton<IUserContext>(new AspNetSessionUserContextAdapter(accesr));
container.Register<IAppAdminAuthorization, SessionAppAdminAuthorization>();
// ...
}