Kraishan
Kraishan

Reputation: 455

Trying to implement singleton gives me stackoverflow error c#

I am trying to make a singleton to account all the controllers I am going to create. When I run the website I get the stackoverflow error. This is my singleton class:

public class MainController 
{
    private DatabaseController databaseController;
    private UserDBController userDBController;
    private static MainController MCinstance = null;
    public MainController()
    {
        if (MCinstance == null)
        {
            databaseController = new DatabaseController();
            userDBController = new UserDBController();
        }
    }
    public static MainController Instance
    {
        get
        {
            if (MCinstance == null)
            {
                MCinstance = new MainController();
            }
            return MCinstance;
        }
    }
    public UserDBController GetUserDBController()
    {
        return userDBController;
    }
    public DatabaseController GetDBController()
    {
        return databaseController;
    }
}

This is how I use the singleton class in a different class:

private UserDBController userDBController = MainController.Instance.GetUserDBController();

What am I doing wrong?

Upvotes: 0

Views: 203

Answers (4)

kenik
kenik

Reputation: 1798

Essentially, this is the only code you need by making use of static classes in C#. The constructor is not public, since it is automatically called the first time you use this class. This class only has one instance.

public static class MainController 
{
    private static DatabaseController databaseController;
    private static UserDBController userDBController;

    static MainController()
    {
        databaseController = new DatabaseController();
        userDBController = new UserDBController();
    }

    public static UserDBController GetUserDBController()
    {
        return userDBController;
    }
    public static DatabaseController GetDBController()
    {
        return databaseController;
    }
}

Upvotes: 0

Vishwajeet Bose
Vishwajeet Bose

Reputation: 430

For singleton use need to use private constructor. And move code of private construct in the place where instance is creating.

    public class MainController 
    {
        private DatabaseController databaseController = new DatabaseController();
        private UserDBController userDBController = new UserDBController();
        private static MainController MCinstance = null;
        private MainController()
        {

        }
        public static MainController Instance
        {
            get
            {
                if (MCinstance == null)
                {
                    MCinstance = new MainController();
                }
                return MCinstance;
            }
        }
        public UserDBController GetUserDBController()
        {
            return userDBController;
        }
        public DatabaseController GetDBController()
        {
            return databaseController;
        }
    }

Upvotes: 0

Ashish Sapkale
Ashish Sapkale

Reputation: 550

You can change your implemention like below,

public class MainController
{
    private DatabaseController databaseController;
    private UserDBController userDBController;
    private static MainController MCinstance = null;

    static MainController()
    {
        MCinstance = new MainController();
        MCinstance.databaseController = new DatabaseController();
        MCinstance.userDBController = new UserDBController();
    }

    public static MainController Instance
    {
        get
        {               
            return MCinstance;
        }
    }

    public UserDBController GetUserDBController()
    {
        return userDBController;
    }

    public DatabaseController GetDBController()
    {
        return databaseController;
    }
}

Upvotes: 1

Oscar
Oscar

Reputation: 13960

You should add the readonly modifier to your MCinstance declaration and instantiate it only once in static constructor.

public class MainController 
{

    public static readonly MainController Instance = null;
    static MainController()
    {
        Instance  = new MainController()
    }
}

Upvotes: 1

Related Questions