Winforms:在整个应用程序中访问类属性

Sha*_*lan 3 singleton global-variables winforms

我知道这一定是一个古老而疲惫的问题,但我似乎无法通过我可信赖的朋友(又名谷歌)找到任何东西.

我有一个.net 3.5 c#winforms应用程序,它在应用程序启动时向用户显示登录表单.成功登录后,我想运行数据库,引入一些特定于用户的数据并将它们(在属性中)保存在一个名为AppCurrentUser.cs的类中,这样可以在程序集中的所有类中访问它们 - 目的这里我可以通过一次性数据读取填充一些属性,而不是每次我需要时调用DB.在Web应用程序中,我通常会使用Session变量,而且我知道WinForms中不存在这个概念.

类结构类似于以下内容:

public class AppCurrentUser {

    public AppCurrentUser() { }

    public Guid UserName { get; set; }
    public List<string> Roles { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
} 
Run Code Online (Sandbox Code Playgroud)

现在,我有一些选择,我需要一些专家建议:

作为一个"哑"类,我应该使属性非静态,实例化类然后设置属性......但是我只能从创建它的类中访问该实例,对吧?

从逻辑上讲,我相信这些属性应该是静态的,因为我将只在整个应用程序中使用该类一次(而不是创建它的新实例),并且它的属性值将在应用程序关闭时"重置".(如果我创建它的一个实例,我可以在应用程序关闭时处理它)

我应该如何构建我的类,以及如何在程序集中的所有类中访问其属性?我真的很感激你对此的诚实和宝贵的建议!

谢谢!

xan*_*ont 5

在这里使用单例模式:

public class AppUser
{
    private static _current = null;
    public static AppUser Current
    {
        get { return = _current; }
    }

    public static void Init()
    {
        if (_current == null)
        {
            _current = new AppUser();
            // Load everything from the DB.
            // Name = Dd.GetName();
        }
    }

    public string Name { get; private set; }
}

// App startup.
AppUser.Init();

// Now any form / class / whatever can simply do:
var name = AppUser.Current.Name;
Run Code Online (Sandbox Code Playgroud)

现在,"静态"的东西是线程不安全的.我将把它作为读者的练习,以弄清楚如何正确使用lock()语法使其成为线程安全的.如果在调用Init之前访问Current属性,您还应该处理这种情况.