Как реализовать одиночный элемент в C#?

Пожалуйста, проверьте ниже код, который я тестировал для отправки электронной почты с помощью Exchange Online:

        MailMessage msg = new MailMessage();
        msg.To.Add(new MailAddress("YourEmail@hotmail.com", "XXXX"));
        msg.From = new MailAddress("XXX@msdnofficedev.onmicrosoft.com", "XXX");
        msg.Subject = "This is a Test Mail";
        msg.Body = "This is a test message using Exchange OnLine";
        msg.IsBodyHtml = true;

        SmtpClient client = new SmtpClient();
        client.UseDefaultCredentials = false;
        client.Credentials = new System.Net.NetworkCredential("XXX@msdnofficedev.onmicrosoft.com", "YourPassword");
        client.Port = 587; // You can use Port 25 if 587 is blocked
        client.Host = "smtp.office365.com";
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.EnableSsl = true;
        try
        {
            client.Send(msg);

        }
        catch (Exception ex)
        {

        }

Порт отправлен (587) для отправки сообщения. Хотя порт 587 не требует мандата STARTTLS, использование порта 587 стало популярным примерно в то же время, когда осознание того, что шифрование SSL / TLS между клиентами и серверами является важной проблемой безопасности и конфиденциальности.

25
задан Dana 17 June 2009 в 21:45
поделиться

14 ответов

Если Вы просто храните некоторые глобальные значения и имеете некоторые методы, которые не должны указывать, Вам не нужен одиночный элемент. Просто сделайте класс и его свойства/методы статичными.

public static class GlobalSomething
{
   public static int NumberOfSomething { get; set; }

   public static string MangleString( string someValue )
   {
   }
}

Singleton является самой полезной, когда у Вас есть нормальный класс с состоянием, но Вы только хотите одного из них. Ссылки, которые предоставили другие, должны быть полезными в исследовании Шаблона "одиночка".

28
ответ дан tvanfosson 28 November 2019 в 18:21
поделиться

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

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();
    }   
}
0
ответ дан Charles Bretana 28 November 2019 в 18:21
поделиться

Лично я пошел бы для платформы внедрения зависимости, как Единица, все они в состоянии настроить одноэлементные объекты в контейнере и улучшили бы связь путем перемещения от зависимости от класса для взаимодействия через интерфейс с зависимостью.

1
ответ дан t3mujin 28 November 2019 в 18:21
поделиться

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

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

Мои 2 цента

1
ответ дан Newtopian 28 November 2019 в 18:21
поделиться

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

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

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

Спрашивают себя это: "Этот класс повредится, если будет больше чем один экземпляр его?" Если ответ не, Вам не нужен одиночный элемент.

1
ответ дан munificent 28 November 2019 в 18:21
поделиться

Мне нравится этот шаблон, хотя он не препятствует тому, чтобы кто-то создал неодноэлементный экземпляр. Это может, иногда может быть лучше обучить разработчиков Вашей команде на использовании правильной методологии по сравнению с попыткой к героическим длинам препятствовать тому, чтобы некоторый knucklehead использовал Ваш код неправильный путь...

    public class GenericSingleton<T> where T : new()
    {
        private static T ms_StaticInstance = new T();

        public T Build()
        {
            return ms_StaticInstance;
        }
    }

...
    GenericSingleton<SimpleType> builder1 = new GenericSingleton<SimpleType>();
    SimpleType simple = builder1.Build();

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

2
ответ дан Scott P 28 November 2019 в 18:21
поделиться

Статический одиночный элемент является в значительной степени анти-шаблоном, если Вы хотите слабо связанный дизайн. Избегайте, если это возможно, и если это не очень простая система, я рекомендовал бы взглянуть на одну из многих доступных платформ внедрения зависимости, такой как http://ninject.org/ или http://code.google.com/p/autofac/ .

Для регистрации / используют тип, настроенный как одиночный элемент в autofac, Вы сделали бы что-то как следующее:

var builder = new ContainerBuilder()
builder.Register(typeof(Dependency)).SingletonScoped()
builder.Register(c => new RequiresDependency(c.Resolve<Dependency>()))

var container = builder.Build();

var configured = container.Resolve<RequiresDependency>();

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

3
ответ дан user7375 28 November 2019 в 18:21
поделиться

Игнорирование проблемы того, необходимо ли использовать Шаблон "одиночка", который был обсужден в другом месте, я реализую одиночный элемент как это:

/// <summary>
/// Thread-safe singleton implementation
/// </summary>
public sealed class MySingleton {

    private static volatile MySingleton instance = null;
    private static object syncRoot = new object();

    /// <summary>
    /// The instance of the singleton
    /// safe for multithreading
    /// </summary>
    public static MySingleton Instance {
        get {
            // only create a new instance if one doesn't already exist.
            if (instance == null) {
                // use this lock to ensure that only one thread can access
                // this block of code at once.
                lock (syncRoot) {
                    if (instance == null) {
                        instance = new MySingleton();
                    }
                }
            }
            // return instance where it was just created or already existed.
            return instance;
        }
    }


    /// <summary>
    /// This constructor must be kept private
    /// only access the singleton through the static Instance property
    /// </summary>
    private MySingleton() {

    }

}
3
ответ дан Sam Meldrum 28 November 2019 в 18:21
поделиться

Я рекомендовал бы прочитать статью , Исследовав Шаблон разработки Singleton, доступный на MSDN. Это детализирует функции платформы, которые делают шаблон простым реализовать.

Как в стороне, я проверил бы связанное продолжение читать ТАК относительно Одиночных элементов .

3
ответ дан Community 28 November 2019 в 18:21
поделиться

Хм, это все кажется немного сложным.

, Почему Вам нужна платформа внедрения зависимости для получения одиночного элемента? Используя МОК контейнер хорошо для некоторого корпоративного приложения, (как долго, поскольку это не злоупотребляется, конечно), но, ах, парень просто хочет знать aboiut реализация шаблона.

, Почему не всегда нетерпеливо инстанцируют, затем предоставьте метод, который возвращает помехи, большая часть кода, записанного выше тогда, уходит. Следуйте за старой пословицей C2 - DoTheSimplestThingThatCouldPossiblyWork...

4
ответ дан Chris Brooks 28 November 2019 в 18:21
поделиться

Можно действительно упростить одноэлементную реализацию, это - то, что я использую:

    internal FooService() { }        
    static FooService() { }

    private static readonly FooService _instance = new FooService();

    public static FooService Instance
    {
        get { return _instance; }
    }
4
ответ дан FlySwat 28 November 2019 в 18:21
поделиться

Одиночные элементы только имеют смысл, если оба из этих условий верны:

  1. объект должен быть глобален
  2. , Там должен только когда-либо существовать единственный экземпляр объекта

Примечание, что № 2 не означает, что Вы были бы как объект только иметь единственный экземпляр - если это так, просто инстанцировать его только однажды - это означает, что там должен (как в, опасно для этого не быть верным) только когда-либо быть единственным экземпляром.

, Если Вы хотите глобальный, просто сделайте глобальный экземпляр из некоторых (не одиночный элемент) объектом (или сделайте его статичным или безотносительно). Если Вы хотите только один экземпляр, снова, статичный Ваш друг. Кроме того, просто инстанцируйте только одного объекта.

Thats мое мнение так или иначе.

5
ответ дан 28 November 2019 в 18:21
поделиться

Singleton != Global. Вы, кажется, ищете ключевое слово static.

6
ответ дан yfeldblum 28 November 2019 в 18:21
поделиться
public class Globals
{
    private string setting1;
    private string setting2;

    #region Singleton Pattern Implementation

    private class SingletonCreator
    {
        internal static readonly Globals uniqueInstance = new Globals();

        static SingletonCreator()
        {
        }
    }

    /// <summary>Private Constructor for Singleton Pattern Implementaion</summary>
    /// <remarks>can be used for initializing member variables</remarks>
    private Globals()
    {

    }

    /// <summary>Returns a reference to the unique instance of Globals class</summary>
    /// <remarks>used for getting a reference of Globals class</remarks>
    public static Globals GetInstance
    {
        get { return SingletonCreator.uniqueInstance; }
    }

    #endregion

    public string Setting1
    {
        get { return this.setting1; }
        set { this.setting1 = value; }
    }

    public string Setting2
    {
        get { return this.setting2; }
        set { this.setting2 = value; }
    }

    public static int Constant1 
    {
        get { reutrn 100; }
    }

    public static int Constat2
    {
        get { return 200; }
    }

    public static DateTime SqlMinDate
    {
        get { return new DateTime(1900, 1, 1, 0, 0, 0); }
    }

}
2
ответ дан awaisj 28 November 2019 в 18:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: