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

Winforms:在整个应用程序中访问类属性,winforms,singleton,global-variables,Winforms,Singleton,Global Variables,我知道这一定是一个老生常谈的问题,但我似乎无法通过我信任的朋友(又名谷歌)找到任何东西 我有一个.NET3.5c#winforms应用程序,它在应用程序启动时向用户提供一个登录表单。成功登录后,我想运行到数据库,提取一些特定于用户的数据,并将它们(在属性中)保存在一个名为AppCurrentUser.cs的类中,这样就可以跨程序集中的所有类访问这些数据-这里的目的是我可以用一次性数据读取填充一些属性,而不是每次我需要打电话给DB。在web应用程序中,我通常使用会话变量,我知道WinForms中不

我知道这一定是一个老生常谈的问题,但我似乎无法通过我信任的朋友(又名谷歌)找到任何东西

我有一个.NET3.5c#winforms应用程序,它在应用程序启动时向用户提供一个登录表单。成功登录后,我想运行到数据库,提取一些特定于用户的数据,并将它们(在属性中)保存在一个名为AppCurrentUser.cs的类中,这样就可以跨程序集中的所有类访问这些数据-这里的目的是我可以用一次性数据读取填充一些属性,而不是每次我需要打电话给DB。在web应用程序中,我通常使用会话变量,我知道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; }
} 
公共类AppCurrentUser{
公共AppCurrentUser(){}
公共Guid用户名{get;set;}
公共列表角色{get;set;}
公共字符串名{get;set;}
公共字符串Lastname{get;set;}
} 
现在,我有一些选择,我需要一些专家建议:

作为一个“哑”类,我应该将属性设置为非静态,实例化该类,然后设置属性……但这样我就只能从创建该实例的类中访问该实例,对吗

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

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


谢谢

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


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

在此处使用单例模式:

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之前访问了当前属性,则还应该处理这种情况。

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


这一原则在或google winforms custom identity中进行了说明。

我不认为这是正确的方法,但您可以这样做(似乎是您要求的):

万一c#错了…我是vb.net开发人员


然后你只需要使用Sessions.USername等

Hi!谢谢你的回复!不,我的BL在一个单独的类中,从UI调用。另外,我的静态和非静态参数有效吗?我想说DI在这里太过分了。Shalan听起来像是个初学者,应该避免依赖注入,直到更好地掌握像Singleton模式这样的基本概念(如您所建议的)为止。在您的第一个选项中,您的意思是将所有信息作为参数传递到每个表单的构造函数中吗?有很多属性,在每个表单中都有属性访问器可能是不可取的(i.t.o.维护)。另一个选择是创建一个具有这些属性的内部静态类,我可以在以后使用这些属性-您对此的想法?嗯…谢谢您的帮助,但不完全是noob开发人员。我承认有些事情我应该知道,就像我的手背一样静态属性会引入线程问题,应该加以解决。
public class Sessions
{
    // Variables
    private static string _Username;

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