Reputation: 455
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
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
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
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
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