【问题标题】:Blazor Server - Session adviceBlazor 服务器 - 会话建议
【发布时间】:2022-01-03 21:27:06
【问题描述】:

我有一个 Blazor 服务器应用。我想在会话中存储一些数据。我正在尝试创建一个会话助手类,我将会话名称存储为枚举,因此它们始终是强类型的。同样在这堂课中,我想把 Get 和 Set。所以我不需要到处做很多注射。会话值可以是字符串、对象。列表等...我开始创建下面的课程,但遇到了一些问题:

  1. 我可以在静态方法中创建以下内容,这样我就不会每次都有新的 SessionManager 对象
  2. 如何让 Get 返回任何类型的对象。我想我需要让它通用一些。

任何帮助将不胜感激

TIA

    using Microsoft.AspNetCore.Components;
    using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage;
    using System.Threading.Tasks;
    
    namespace Core
    {
        public class SessionManager
        {
            [Inject] ProtectedSessionStorage storage { get; set; }
    
            public enum eSessionNames
            {
                UserName,
                UserRow
            }
    
            public async Task SetSession(eSessionNames SessionName, object Value)
            {
                await storage.SetAsync(SessionName.ToString(), Value);
            }
    
            public async Task<T> GetSession(eSessionNames SessionName)
            {
                return await storage.GetAsync<T>(SessionName.ToString());
            }
        }
    }


MY DAL trying to use your method

        public async static Task<Models.myModel> GetUserFromProtectedBrowserStorageAsync(string UserNetworkID)
        {
            using (var connection = new SqlConnection(Core.ConnectionStringManager.GetConnectionString()))
            {
                await connection.OpenAsync();

                MyBlogProtectedBrowserStorage pbs = new();  //I get an error on this line as im not sure how to new the object

                Models.myModel output = await pbs.GetAsync<Models.myModel>("UserRow");

                if (output == null)
                {
                    var values = new { UserNetworkID };

                    output await connection.QuerySingleAsync<CsatUserModel>("SELECT * FROM tblUsers WHERE NetworkID = @UserNetworkID", values, commandType: CommandType.Text);

                    pbs.SetAsync<Models.myModel>("UserRow", output);

                    return output;
                }
                else
                {
                    return output;
                }
            }
        }

【问题讨论】:

    标签: blazor


    【解决方案1】:

    您不需要在 Blazor 服务器中使用受保护的会话存储,因为 Blazor 服务器可以在服务器端维护应用会话状态。

    出于您的目的,我建议您使用 IMemoryCache。它使用简单,适用于所有类型的类。

    https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-6.0

    【讨论】:

      【解决方案2】:

      会话的概念在 Blazor Server 中并不真正存在,至少在传统意义上不存在。 您可以使用 ProtectedSessionStorage 广告,也可以使用依赖注入并注入一个范围内的类。这将使您在有连接(电路)时可以访问该类,如果由于某种原因连接失败,则作用域类也将消失。

      回答您的问题:

      1. 不要使用静态方法将 Sessionmanager 注入到您的组件和/或类中。这样可以更轻松地查看依赖项和编写测试。
      2. 这是一个例子:
      public class MyBlogProtectedBrowserStorage
      {
          ProtectedSessionStorage storage { get; set; }
          public MyBlogProtectedBrowserStorage(ProtectedSessionStorage storage)
          {
              this.storage = storage;
          }
      
          public async Task DeleteAsync(string key)
          {
              await storage.DeleteAsync(key);
          }
      
          public async Task<T?> GetAsync<T>(string key)
          {
              var value = await storage.GetAsync<T>(key);
              if (value.Success)
              {
                  return value.Value;
              }
              else
              {
                  return default(T);
              }
          }
      
          public async Task SetAsync(string key, object value)
          {
              await storage.SetAsync(key, value);
          }
      }
      

      【讨论】:

      • 嗨,吉米,感谢您的上述帮助。我希望使用这种方法来防止数据库命中。我假设使用受保护的浏览器存储比进行数据库命中更有效。我在我的 DAL 中调用上述方法,可以这样做吗?我不确定我如何新建对象?我在下面包含了我的代码-在我上面的问题中,因为我无法将其添加到此评论中非常感谢您的所有帮助,TIA
      • 不要新建对象,使用依赖注入。我会非常担心往返数据库的问题,如果它成为问题,我会担心。 ProtectedStorage 会将数据保存在客户端,因此它将通过 SignalR 向客户端发送数据,这很耗时,您应该只保存少量数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      相关资源
      最近更新 更多