Nick
Nick

Reputation: 1269

Creating a Global Object?

I'm trying to achieve the following:

When a user has been successfully authenticated, I need to create a Global user object which I can access from different Forms (or classes).

I was looking through the Data Sources available in VS, and saw there's a "Object" option which may be suitable for what I'm trying to achieve. The trouble is, I have no idea how it works.

Can anyone point me in the right direction?

Thanks.

Upvotes: 3

Views: 7446

Answers (3)

TrueWill
TrueWill

Reputation: 25523

It's called a Singleton, and it's a Bad Thing (especially when its state can be mutated). Investigate Dependency Injection (DI) instead. There's even a .NET-specific book on it.

Per request, here's a simple (probably oversimplified) example of doing DI manually. A DI Container library (also known as an Inversion of Control or IoC Container library) can simplify the process of "wiring everything up" in the composition root, and usually also provides lifetime management and other features.

// 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;
}

Upvotes: 2

competent_tech
competent_tech

Reputation: 44931

Assuming that this is a Windows Forms application, you can create a User class that is stored in a static ApplicationState class.

Steps:

1) Create your user class to hold information about the user:

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

2) Create your ApplicationState class:

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

3) In your login process, create a new version of the user class and assign it to the ApplicationState.CurrentUser property:

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

        user.Login = sLogin;

        ApplicationState.CurrentUser = user;
    }

4) You can now use ApplicationState.CurrentUser just about anywhere in your project.

Upvotes: 4

MethodMan
MethodMan

Reputation: 18843

You could use or create a public List making sure that you only add the authenticated users to the List once they have been validated you could even do this via encapsulating field access, create a List or string[] property what you are asking you probably would want to create a class level Property.

Upvotes: 0

Related Questions