Asp.net core .NET Core 3.1复杂会话包装器不工作

Asp.net core .NET Core 3.1复杂会话包装器不工作,asp.net-core,.net-core,session-variables,session-state,Asp.net Core,.net Core,Session Variables,Session State,我试图在.NETCore3.1中创建一个复杂的会话包装器。我遇到了一个没有设置变量的问题。这是我设置会话包装器类的方法 public class SessionWrapper : ISessionWrapper { private static IHttpContextAccessor context; public SessionWrapper(IHttpContextAccessor _context) { context = _context;

我试图在.NETCore3.1中创建一个复杂的会话包装器。我遇到了一个没有设置变量的问题。这是我设置会话包装器类的方法

public class SessionWrapper : ISessionWrapper
{
    private static IHttpContextAccessor context;
    public SessionWrapper(IHttpContextAccessor _context)
    {
        context = _context;
    }
    public static Course Course
    {
        get
        {

            var key = context.HttpContext.Session.GetString("course");
            if (key == null)
            {
                return default;
            }
            else
            {
                return JsonConvert.DeserializeObject<Course>(key);
            }
        }
        set
        {
            if(value != null)
            {
                context.HttpContext.Session.SetString("course", JsonConvert.SerializeObject(value));
            }
        }
    }
}
在我的控制器中,我正在初始化课程并设置会话包装器。然后,我将课程id设置为4。这不是抱怨,但课程id没有设置。它总是空的。我已经看了这么久了,感到很沮丧。我错过了什么

  Course myCourse = new Course();
  SessionWrapper.Course = myCourse;
  SessionWrapper.Course.Id = "4"

我觉得你的包装本身并不是最好的方法。当然,一个有自我意识的子类拥有在会话中存储自己的“诀窍”,在我看来更符合逻辑。这样,您就将控制器从管理持久性的责任中解放出来

公共抽象类课程
{
公共抽象int Id{get;set;}
}
公共课课程:课程
{
私人内部id;
公共覆盖int-Id
{ 
get=>\u id;
设置{u id=value;UpdateSession();}
}
//GetCourse方法是用于创建SessionCourse对象的工厂
//并为其提供ISession对象,以便它们可以存储自己。
公共静态课程GetCourse(IServiceProvider服务)
{
ISession session=services.GetRequiredService()?.HttpContext.session;
SessionCourse课程=会话?.GetJson(“课程”)??新建SessionCourse();
课程。课时=课时;
返回路线;
}
[JsonIgnore]
专用ISession会话{get;set;}
私有void UpdateSession(){
SetJson(“课程”,本节);
}
}
现在的诀窍是使用SessionCourse对象来满足对Course对象的请求,SessionCourse对象将自身存储在会话中。可以通过为course对象添加具有lambda表达式的作用域服务来实现这一点。结果是对课程服务的请求将返回SessionCourse对象

services.AddScoped(sp=>SessionCourse.GetCourse(sp));
services.AddSingleton();
因此,创建此类服务的好处在于,它允许您简化使用课程对象的控制器

公共类课程控制器:控制器
{
私人课程;
公共交通管制员(课程服务)
{
课程=课程服务;
}
公共无效SetCourseId()
{
course.Id=“4”;
}
SessionExtension.cs定义用于向会话添加对象的扩展方法

公共静态类SessionExtensions{
公共静态void SetJson(此ISession会话、字符串键、对象值){
SetString(key,JsonConvert.SerializeObject(value));
}
公共静态T GetJson(此ISession会话,字符串键){
var sessionData=session.GetString(键);
return sessionData==null?默认值(T):JsonConvert.DeserializeObject(sessionData);
}
}

如何从客户端修改和访问它?在视图中定义客户端?例如通过
@inject-Course
进行。在阅读了一些评论后,我想知道在会话中保存对象是个坏主意。
app.UseSession(); 
  Course myCourse = new Course();
  SessionWrapper.Course = myCourse;
  SessionWrapper.Course.Id = "4"