Как реализовать синглтон в C #? - PullRequest
24 голосов
/ 29 октября 2008

Как мне реализовать шаблон синглтона в C #? Я хочу добавить в него свои константы и некоторые базовые функции, поскольку я использую их везде в своем проекте. Я хочу, чтобы они были «глобальными», и не нужно вручную связывать их с каждым созданным мной объектом.

Ответы [ 17 ]

1 голос
/ 30 октября 2008

Лично я бы выбрал инфраструктуру внедрения зависимостей, такую ​​как Unity, все они могут настраивать одноэлементные элементы в контейнере и улучшают связывание, переходя от зависимости класса к зависимости интерфейса.

1 голос
/ 29 октября 2008

То, что вы описываете, это просто статические функции и константы, , а не синглтон. Шаблон одноэлементного проектирования (который очень редко нужен) описывает класс, для которого создается , но только один раз, автоматически при первом использовании.

Он сочетает в себе ленивую инициализацию с проверкой, чтобы предотвратить множественные экземпляры. Это действительно полезно только для классов, которые заключают в себе некоторую физически единственную концепцию, например обертку вокруг аппаратного устройства.

Статические константы и функции - это просто код, который вообще не нуждается в экземпляре.

Задайте себе вопрос: «Разрушится ли этот класс, если его будет более одного экземпляра?» Если ответ «нет», вам не нужен синглтон.

1 голос
/ 29 октября 2008

хммм ... Мало констант со связанными функциями ... разве это не лучше достичь с помощью перечислений? Я знаю, что вы можете создать пользовательское перечисление в Java с помощью методов, и все то же самое должно быть достижимо в C #, если не поддерживается напрямую, то это можно сделать с помощью простого класса singleton с закрытым конструктором.

Если ваши константы семантически связаны, вы должны учитывать перечисления (или эквивалентную концепцию), вы получите все преимущества статических переменных const + вы сможете использовать в своих интересах проверку типов компилятора.

Мои 2 цента

0 голосов
/ 09 ноября 2018
public class Singleton
{
   private static Singleton _instance;
   public static Singleton Instance => _instance ?? (_instance = new Singleton());
}
0 голосов
/ 09 декабря 2017

Я написал класс для своего проекта, используя шаблон Singleton. Он очень прост в использовании. Надеюсь, это сработает для вас. Пожалуйста, найдите следующий код.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TEClaim.Models
{
public class LogedinUserDetails
{
    public string UserID { get; set; }
    public string UserRole { get; set; }
    public string UserSupervisor { get; set; }
    public LogedinUserDetails()
    {

    }

    public static LogedinUserDetails Singleton()
    {
        LogedinUserDetails oSingleton;

        if (null == System.Web.HttpContext.Current.Session["LogedinUserDetails"])
        {               
            oSingleton = new LogedinUserDetails();
            System.Web.HttpContext.Current.Session["LogedinUserDetails"] = oSingleton;
        }
        else
        {              
            oSingleton = (LogedinUserDetails)System.Web.HttpContext.Current.Session["LogedinUserDetails"];
        }

        //Return the single instance of this class that was stored in the session
        return oSingleton;
    }
}
}

Теперь вы можете установить значение переменной для приведенного выше кода в вашем приложении следующим образом ..

[HttpPost]
public ActionResult Login(FormCollection collection)
{
  LogedinUserDetails User_Details = LogedinUserDetails.Singleton();
  User_Details.UserID = "12";
  User_Details.UserRole = "SuperAdmin";
  User_Details.UserSupervisor = "815978";
  return RedirectToAction("Dashboard", "Home");
}

И вы можете получить эти значения, как это ..

public ActionResult Dashboard()
    {
        LogedinUserDetails User_Details = LogedinUserDetails.Singleton();
        ViewData["UserID"] = User_Details.UserID;
        ViewData["UserRole"] = User_Details.UserRole;
        ViewData["UserSupervisor"] = User_Details.UserSupervisor;

        return View();
    }
0 голосов
/ 05 апреля 2018

В c # это может быть (поточно-ориентированная и ленивая инициализация):

public sealed class MySingleton
{
    static volatile Lazy<MySingleton> _instance = new Lazy<MySingleton>(() => new MySingleton(), true);
    public static MySingleton Instance => _instance.Value;
    private MySingleton() { }
}
0 голосов
/ 30 октября 2008

Скрывая открытый конструктор, добавляя приватное статическое поле для хранения этого единственного экземпляра, и добавляя статический метод фабрики (с ленивым инициализатором), чтобы вернуть этот единственный экземпляр

public class MySingleton   
{  
    private static MySingleton sngltn; 
    private static object locker;  
    private MySingleton() {}   // Hides parameterless ctor, inhibits use of new()   
    public static MySingleton GetMySingleton()       
    {     
        lock(locker)
            return sngltn?? new MySingleton();
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...