创建全局对象?

时间:2011-12-18 23:49:08

标签: c# visual-studio object

我正在努力实现以下目标:

当用户成功通过身份验证后,我需要创建一个全局用户对象,我可以从不同的表单(或类)访问该对象。

我正在查看VS中可用的数据源,并看到有一个“对象”选项,它可能适合我想要实现的目标。麻烦的是,我不知道它是如何运作的。

有人能指出我正确的方向吗?

感谢。

3 个答案:

答案 0 :(得分:4)

假设这是一个Windows窗体应用程序,您可以创建一个存储在静态ApplicationState类中的User类。

步骤:

1)创建用户类以保存有关用户的信息:

public class User
{
    public string Login { get; set; }
    //.. other properties
}

2)创建ApplicationState类:

public static class ApplicationState
{
    public static User CurrentUser { get; set; }
}

3)在登录过程中,创建用户类的新版本并将其分配给ApplicationState.CurrentUser属性:

    public void CompleteLogin(string sLogin)
    {
        User user = new User();

        user.Login = sLogin;

        ApplicationState.CurrentUser = user;
    }

4)您现在可以在项目的任何位置使用ApplicationState.CurrentUser

答案 1 :(得分:2)

它被称为Singleton,这是一件坏事(特别是当它的状态可以变异时)。调查Dependency Injection(DI)。它上面甚至还有一个.NET-specific book

根据请求,这是一个简单的(可能是过于简化的)手动执行DI的示例。 DI Container library(也称为控制反转或IoC容器库)可以简化组合根中“连接所有内容”的过程,通常还提供生命周期管理和其他功能。

// Composition root of your application
void Main()
{
    // Only instance of user we will ever create
    var user = new User();

    var instance = new MyClass(user);
}

public interface IUser
{
    string Name { get; set; }
}

public class User: IUser
{
    public string Name { get; set; }
}

public class MyClass
{
    public MyClass(IUser user)
    {
        if (user == null)
        {
            throw new ArgumentNullException("user");
        }

        _user = user;
    }

    private readonly IUser _user;
}

答案 2 :(得分:0)

您可以使用或创建一个公共列表,确保只有在经过验证后才能将经过身份验证的用户添加到列表中,您甚至可以通过封装字段访问,创建List或string []属性来执行此操作你可能想要创建一个类级别的属性。