Решение, которое нужно рассмотреть (вместо того, чтобы катиться вручную) - использовать контейнер IoC, например. Unity .
Контейнеры IoC обычно поддерживают регистрацию экземпляра в интерфейсе. Это обеспечивает ваше поведение синглтона, поскольку клиенты, выполняющие сопоставление с интерфейсом, получат единственный экземпляр.
//Register instance at some starting point in your application
container.RegisterInstance<IActiveSessionService>(new ActiveSessionService());
//This single instance can then be resolved by clients directly, but usually it
//will be automatically resolved as a dependency when you resolve other types.
IActiveSessionService session = container.Resolve<IActiveSessionService>();
Вы также получите дополнительное преимущество, заключающееся в том, что вы можете легко изменять реализацию синглтона, поскольку он зарегистрирован в интерфейсе. Это может быть полезно для производства, но, возможно, больше для тестирования. Истинные одиночки могут быть довольно болезненными в тестовой среде.