C# 在mvc core中注册DI时如何访问ISession

C# 在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(

我在Mvc核心中为我的DI使用SimpleInjector,我有一个类在构造函数中接受ISession

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>();

    // ...
}