2009-08-10 75 views
3

我知道这一定是一个古老而疲惫的问题,但我似乎无法通过我的可信赖的朋友(又名Google)找到任何东西。Winforms:在整个应用程序中访问类属性

我有一个.NET 3.5的C#WinForms应用程序,呈现与应用程序启动时登录表单的用户。成功登录后,我要逃跑到数据库中,一些用户特定的数据拉,并把它们(在属性)在一个叫AppCurrentUser.cs类,可随后上可以在所有课程中的装配访问 - 这里的目的是我可以用一次性的数据读取来填充一些属性,而不是每次需要时都调用数据库。在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; } 
} 

现在,我有一些我需要一些专家的意见选择:

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

从逻辑上讲,我认为,这些属性应该是静态的,因为我将只使用类一次整个应用程序(和创造它的新实例),它的属性值将被“复位”上申请关闭。 (如果我创建它的一个实例,我可以在应用程序关闭处理掉吧)

我应该如何构建我的课怎么办我访问它的属性在所有课程中我的组装?我真的很感谢你对此的诚实和有价值的建议!

谢谢!

回答

5

这里使用Singleton模式:

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

这取决于你如何设置架构。如果你做你所有的业务逻辑代码的实际表单中(例如,它连接到UI),那么你可能想传递用户信息作为参数,当你犯了一个表格,然后从内保持对它的引用形成。换句话说,你会实施Singleton模式。

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

+0

嗨!谢谢回复!不,我的BL在一个单独的类中,并从UI中调用。此外,我有效与我的静态与非静态参数? – Shalan 2009-08-10 23:03:45

+0

立即阅读StructureMap – Shalan 2009-08-10 23:05:59

+0

我会说DI在这里是过度杀伤。 Shalan听起来像他可能是一个初学者,应该避免依赖注入,直到像Singleton Pattern这样的更基本的概念 - 如你所说 - 更好地掌握。 – xanadont 2009-08-10 23:14:07

0

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

此校长在Rocky Lhotka's CLSA books或谷歌winforms自定义标识说明。

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等等等

+0

静态属性引入线程问题,应予以解决。 – xanadont 2009-08-10 23:15:48