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