3

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

我有一个 .net 3.5 c# winforms 应用程序,它在应用程序启动时向用户显示登录表单。成功登录后,我想跑到数据库,拉入一些特定于用户的数据并将它们(在属性中)保存在一个名为AppCurrentUser.cs的类中,可以跨程序集中的所有类访问该类 - 目的在这里,我可以使用一次性读取的数据填充一些属性,而不是每次需要时都调用数据库。在 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

4 回答 4

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 属性,您还应该处理这种情况。

于 2009-08-10T23:08:14.177 回答
1

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

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

于 2009-08-10T23:00:01.713 回答
0

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

此主体在Rocky Lhotka 的 CLSA 书籍或 google winforms custom identity 中有说明。

于 2009-08-10T23:08:22.787 回答
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 等

于 2009-08-10T23:10:00.943 回答