Нужно ли мне реализовывать одноэлементный класс вручную в .net, даже при использовании .Net4.0? - PullRequest
3 голосов
/ 27 апреля 2010

Как только шаблон синглтона будет понят, написание последующих классов синглтона на C # - это бездумное упражнение. Я надеюсь, что фреймворк поможет вам, предоставив интерфейс или базовый класс для этого. Вот как я это себе представляю:

public sealed class Schablone : ISingleton<Schablone>
{
    // Stuff forced by the interface goes here

    // Extra logic goes here
}

Существует ли то, что я ищу?

Есть ли синтаксический сахар для создания одноэлементного класса - с интерфейсом, атрибутом класса и т. Д.?

Можно ли написать полезный и пуленепробиваемый ISingleton для себя? Хочешь попробовать?

Спасибо!

Ответы [ 8 ]

4 голосов
/ 27 апреля 2010

Как часто вы пишете синглтон-классы?

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

Написание синглтон-класса на C # не просто безмозгло, а почти безболезненно. Требуемая плита котла крошечная, при условии, что вам не требуется абсолютная лень до такой степени, что не следует создавать экземпляр синглтона, просто вызывая другие статические методы.

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton();
    public static Singleton Instance { get { return instance; } }

    private Singleton() {}

    // Omit if you don't care about type initializer laziness
    static Singleton() {}
}

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

Действительно, трудно понять, как это может быть framework , а не language Feature ... по крайней мере компилятор должен был бы знать об этом, понять, что будет какое-то волшебное свойство "Экземпляр" (или что-то еще), которое оно должно сделать доступным для вызывающих.

Поскольку Эрик Липперт любит указывать (вполне разумно, я мог бы добавить), языковые функции связаны с большими затратами с точки зрения проектирования, реализации и тестирования. Кроме того, каждый разработчик узнает о новой языковой функции. Короче говоря, они должны действительно заработать свою ценность - и для меня паттерн синглтона не достаточно полезен и важен, чтобы сделать планку.

3 голосов
/ 27 апреля 2010

Что тут силы? Синглтон может быть реализован с одним свойством и полем. Не похоже, что здесь есть какое-то очень хорошее соотношение цены и качества, с которым могут столкнуться разработчики фреймворка.

Не говоря уже о том, что шаблон синглтона часто является плохим в использовании, и IMO было бы плохо иметь структуру, продвигающую их. Для меня синглтон - это почти всегда запах кода.

2 голосов
/ 28 апреля 2010

Как отметили другие и я (в комментариях), шаблон синглтона редко подходит.

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

public static class Singleton<T> where T: class, new() {
    public static T Instance {
        get {
            return Nested.instance;
        }
    }

    private static class Nested {
        public static readonly T instance = new T();

        static Nested() {}
    }
}

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

Затем вы можете использовать его следующим образом:

Singleton<MyClass>.Instance.DoSomething();
1 голос
/ 28 апреля 2010

Cut. Вставить. Далее.

1 голос
/ 28 апреля 2010

.Net 4.0 поставляется с MEF. И вы можете использовать MEF для создания экземпляра синглтона. Через общую политику создания. Я выкопаю пример кода ....

РЕДАКТИРОВАТЬ ----

еще лучше, вот немного доко ....

http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide

1 голос
/ 28 апреля 2010

Используйте контейнер Inversion of Control для управления им.

С StructureMap вы можете объявить любой тип как одиночный:

ObjectFactory.Initilialize(x => x.ForSingletonOf<Schablone>());

Чтобы получить его:

ObjectFactory.GetInstance<Schablone>();
1 голос
/ 27 апреля 2010

Я не думаю, что это возможно.

Как интерфейс запрещает вам добавлять открытый конструктор в ваш класс?

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

1 голос
/ 27 апреля 2010

Нет, в .Net Framework нет ничего подобного.Вы должны написать синглтоны самостоятельно.Было бы немного сложно иметь определяющий API для синглтонов, поскольку существует так много способов их реализации, и в зависимости от ваших целей зависит, какой подход вы выберете.* статья о синглетонах .(Написано Джоном - Он мудрый парень, слушайте его) за руководством и советами по различным методам.Он охватывает некоторые вещи, о которых большинство людей, возможно, даже и не задумывались.

[Многие люди считают шаблон синглтона сомнительной моделью проектирования.Я не буду вдаваться в причины здесь, но если ваш заинтересованный Google имеет много информации.Просто будьте осторожны, не злоупотребляйте им без необходимости.]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...