Singleton C# с конструктором, который принимает параметры

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

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

22
задан 14 July 2009 в 01:38
поделиться

5 ответов

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

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

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

SingletonFactory<Foo>.Instance;

Но что мешает мне также сделать это:

Foo foo = new Foo();

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

Примечание: То же самое касается неуниверсального синглтона, который принимает экземпляр объекта. Я уверен, что вы можете экстраполировать из моего предыдущего примера многие аналогичные причины, по которым одноэлементная оболочка, которая принимает и ссылку на объект, также была бы плохой идеей.

17
ответ дан 29 November 2019 в 05:38
поделиться

То, что вы описываете, является универсальным синглтоном. Выглядит это так:

public class SingletonProvider <T> where T:new()
{
    SingletonProvider() {}

    public static T Instance
    {
        get { return SingletonCreator.instance; }
    }

    class SingletonCreator
    {
        static SingletonCreator() { }

        internal static readonly T instance = new T();
    }
}

http://www.codeproject.com/KB/cs/genericsingleton.aspx

2
ответ дан 29 November 2019 в 05:38
поделиться

То, о чем вы конкретно просите, выглядит примерно так, я думаю:

public sealed class Singleton {
    static Singleton instance = null;
    static readonly object padlock = new Object();
    Object o;

    Singleton(Object _o) {
        o = _o;
    }

    public static Singleton Instance(Object _o) {
        lock (padlock) {
            if (instance == null) {
                instance = new Singleton(_o);
            }
            return instance;
        }
    }
}

Singleton s = Singleton.Instance(new Object());

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

2
ответ дан 29 November 2019 в 05:38
поделиться

Вам нужен частный конструктор и затем метод getInstance, этот метод должен получить параметр, конструктор должен быть закрытым и также может иметь параметры, но getInstance должен передать его, нет. Кстати, что ты делаешь? Какой-нибудь реальный пример может помочь.

1
ответ дан 29 November 2019 в 05:38
поделиться

Одна вещь, которую вы можете сделать, - это придерживаться найденного синглтон-образца и просто выставлять свойство (установщик, если необходимо, также добавить геттер) и использовать его как MySingleton.Instance.MyReference = new MyObject ();

Если вам нужно ограничить использование вашего одноэлементного объекта, например, любые операции с одноэлементным объектом до установки ссылки должны быть незаконными, вы можете имеют частный логический флаг, например hasBeenIntialized, и установщик MyReference установит флаг внутренне. Все остальные методы будут проверять флаг в начале выполнения и генерировать исключение, если вызывается какой-либо метод, если hasBeenInitialized имеет значение false.

Если вам нужно иметь поведение только для чтения, вы можете создать исключение в установщике MyReference, если кто-то захочет назначить другой объект, когда hasBeenInitialized имеет значение true.

0
ответ дан 29 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

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