Изучая паттерн Singleton
столкнулся с тем ,что классическая реализация данного паттерна очень хромает в плане потокобезопасности и что Lazy-реализация будет намного предпочтительней...
Теперь сам вопрос : можно ли как-то совместить эти две реализации(код попытки ниже) либо есть ли какой-то альтернативный вариант на с#
,который позволит избежать танцев с бубном при использовании данного паттерна .Net разработчику.
А если есть ,то не будет ли альтернативный вариант нарушать принципов ООП и не будет ли так же сложно использовать модульное тестирование .
Например,здесь - Замена синглтона в php ,где с класса Singleton
просто делают самый обычный класс ,но сам объект при надобности - создают при помощи IoC-контейнера . Хотелось бы узнать оптимальный вариант в даной ситуации ,спасибо.
Ну и попытка совместить Lazy Loading с потокобезопасной реализацией :
public class Singleton
{
public string Name { get; private set; }
private Singleton()
{
Name = System.Guid.NewGuid().ToString();
}
public static Singleton GetInstance()
{
return Nested.instance;
}
private class Nested
{
internal static readonly Singleton instance = new Singleton();
}
}
Реализация от @RusGIS правильная, новотельная еще пример потокобезопасного с msdn
https://msdn.microsoft.com/en-us/library/ff650316.aspx?f=255&MSPPError=-2147217396
using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
если используете различный сторонние библиотеки, то для этого, к приему в mvvm фреймворках, есть встроенные инструменты для его реализации.
к примеру MvvmCross:
CreatableTypes()
.EndingWith("Service")
.AsInterfaces()
.RegisterAsLazySingleton();
или
Mvx.RegisterSingleton<IMyClass>(new MyClass);
можете выбирать.
Вот реализация синглтон + Lazy+ потокобезопасность.
public sealed class LazySingleton
{
private static readonly Lazy<LazySingleton> _instance = new Lazy<LazySingleton>(() => new LazySingleton());
LazySingleton() {}
public static LazySingleton Instance { get { return _instance.Value; } }
}
Данная реализация взята из книги Сергея Теплякова "Паттерны проектирования на платформе .NET."
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Господа, встал такой вопрос - имеется SSO SAML token примерно в таком виде -
Есть свой List - как реализовать,чтобы слова были в алфавитном порядке от 1-ой буквы