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

时间:2009-08-10 22:52:38

标签: winforms singleton global-variables

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

我有一个.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; }
} 

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

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

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

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

谢谢!

4 个答案:

答案 0 :(得分: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;

现在“静态”的东西是线程不安全的。我将把它作为读者的练习,以弄清楚如何正确使用lock()语法使其成为线程安全的。如果在调用Init。

之前访问Current属性,也应该处理这种情况

答案 1 :(得分:1)

这取决于您如何设置架构。如果您在实际表单中执行所有业务逻辑代码(例如将其耦合到UI),那么您可能希望在创建表单时将用户信息作为参数传递,然后在其中保留对它的引用形成。换句话说,您将实现Singleton模式。

您也可以使用依赖注入,这样每次请求用户对象时,依赖注入框架(如StructureMap)都会为您提供正确的对象。 - 您可能会像会话变量一样使用它,因为您将在有状态的环境中工作。

答案 2 :(得分:0)

存储此类信息的正确位置是IIdentity的自定义实现。您需要识别用户或其访问权限所需的任何信息都可以存储在该对象中,然后该对象与当前线程关联,并且可以在需要时从当前线程查询。

此主体在Rocky Lhotka's CLSA books或google winforms自定义标识中说明。

答案 3 :(得分:0)

我不相信这是正确的方法,但你可以做这样的事情(似乎是你要求的):

public class Sessions
{
    // Variables
    private static string _Username;

    // properties
    public static string Username
    {
        get
        {
            return _Username;
        }
        set
        {
            _Username = value;
        }
    }
}

以防c#错误...我是vb.net开发者......

那么你只需要使用Sessions.USername等