c# - 使用静态类处理 session 数据

标签 c# asp.net asp.net-mvc

我手上有一个 Windows 窗体应用程序,其中 GUI 和业务逻辑清晰分离。该解决方案很大(40 个项目、数千个类、大约 2000 个数据库表)。我的任务是找到一个关于如何重用业务逻辑来构建 Web 应用程序作为前端的解决方案。

我认为主要问题是我们的静态 Session 类,解决方案中的所有其他类都使用该类:

public static class Session
{
    public static string CurrentUser { get; set; }

    public static string CurrentDatabase { get; set; }

    public static string CurrentCompanyProfile { get; set; }

    public static string CurrentLanguage { get; set; }
}

这个类不能在 ASP.NET 中工作,因为它会被所有用户共享,而且我无法替换它,因为它被大量使用。

我想我需要从这个类中删除所有信息并只保留接口(interface)。通过调用属性代码的 get 方法,会以某种方式将此调用重定向到 HttpContext.Current.Session,我将在其中存储包含所有这些信息的类。

考虑到 Session 驻留在一个不会引用 System.Web 的程序集中,并且考虑到我不能破坏我们的 WinForms 实现,我不确定如何正确执行此操作。

谢谢。

最佳答案

假设你可以更新Session类,你可以抽象Session类中属性的存储。在当前的应用程序中,您可以创建一个简单的内存存储,在 Web 应用程序中,您可以创建一个 Web session 存储。

首先定义一个 session 值提供程序,您在当前的静态 Session 类中使用它。

public interface ISessionValueProvider {
    string CurrentUser { get; set; }
    string CurrentDatabase { get; set; }
    string CurrentCompanyProfile { get; set; }
    string CurrentLanguage { get; set; }
}

public static class Session {
    private static ISessionValueProvider _sessionValueProvider;
    public static void SetSessionValueProvider(ISessionValueProvider provider) {
        _sessionValueProvider = provider;
    }

    public static string CurrentUser { 
        get { return _sessionValueProvider.CurrentUser; } 
        set { _sessionValueProvider.CurrentUser = value; } 
    }
    // Etc for the other props
}

与您当前的应用程序相比,定义一个 session 值提供程序,它使用内存来存储值。

public class MemorySessionValueProvider: ISessionValueProvider {
    public string CurrentUser {get; set; }
    // Etc for the other props
}

要使用它,请创建一个实例并将其提供给静态 session 类。例如,您可以将其添加到 Main 方法中。

Session.SetSessionValueProvider(new MemorySessionValueProvider());

现在,为您的 Web 应用程序创建一个使用 Web session 的 session 值提供程序。

public class WebSessionValueProvider: ISessionValueProvider {
    private const string CURRENTUSERKEY = "CurrentUser"; // TODO: Change this if necessary
    public string CurrentUser {
        get { return (string)HttpContext.Current.Session[CURRENTUSERKEY]; }
        set { HttpContext.Current.Session[CURRENTUSERKEY] = value; }
    }

    // Etc for the other props
}

再次,将此 web-session-value-provider 的实例提供给静态 session 类。例如,在 global.asax 中。

Session.SetSessionValueProvider(new WebSessionValueProvider);

关于c# - 使用静态类处理 session 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18012154/

相关文章:

c# - MVCMailer SendAsync() 因 Amazon SES 而失败

ASP.NET 在生产机器上变得 FUBAR

c# - RhinoMock - 使用一个真实的对象,但 stub 一个单一的方法

asp.net - 我无法使用 "host.docker.internal:some-port"将我的 ASP .NET 应用程序从 Docker 容器连接到我的计算机主机数据库

javascript - ajax调用错误的链接路径

c# - SoundPlayer.Play的实现是什么,它不允许播放多个声音异步声音?

C# 表单问题

c# - 更改 GridView 标题位置

c# - 另一个页面( session )之间的列表框中的双值(并列)。我需要页面之间列表框中的文本+值(变量 session )

asp.net - 我的 IFrame 有问题