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)
现在,我有一些选择,我需要一些专家建议:
作为一个"哑"类,我应该使属性非静态,实例化类然后设置属性......但是我只能从创建它的类中访问该实例,对吧?
从逻辑上讲,我相信这些属性应该是静态的,因为我将只在整个应用程序中使用该类一次(而不是创建它的新实例),并且它的属性值将在应用程序关闭时"重置".(如果我创建它的一个实例,我可以在应用程序关闭时处理它)
我应该如何构建我的类,以及如何在程序集中的所有类中访问其属性?我真的很感激你对此的诚实和宝贵的建议!
谢谢!
在这里使用单例模式:
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属性,您还应该处理这种情况.
归档时间: |
|
查看次数: |
1242 次 |
最近记录: |