Шаблон Singleton используется для создания веб-службы, но как насчет утилизации. - PullRequest
2 голосов
/ 30 марта 2012

Я использовал шаблон синглтона для создания единственного экземпляра веб-службы, который я использую в своем приложении для создания форм.Я видел, что это хорошая практика для веб-приложений.Мне было интересно, это то же самое для приложений Winform тоже?Кроме того, я должен беспокоиться об удалении веб-службы (то есть прокси-объекта впоследствии) - у него есть метод .Dispose, но я нигде не вызываю его в своем коде.В моем приложении я вызываю все мои веб-методы асинхронно.Это может звучать глупо, но я не знаю, где мне нужно позвонить утилизировать.Кто-нибудь может помочь?

class ListService
{
    private static RetrieveList s_proxy;

    private static readonly object s_lock = new object();

    private static readonly string s_webServiceURL = Authentication.RetrieveListUrl;

    internal static RetrieveList Proxy
    {
        get
        {
            lock (s_lock)
            {
                if (s_proxy == null)
                {
                    s_proxy = new RetrieveList();
                    s_proxy.Url = s_webServiceURL;
                }

                return s_proxy;
            }
        }
    }

}

Ответы [ 2 ]

4 голосов
/ 30 марта 2012

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

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

Однако некоторые люди могут нахмуриться и сказать: «Что, если Dispose сделает что-то важное для меня, кроме освобождения ресурсов?». Вы все равно можете вызвать Dispose после запуска приложения:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new LogAnalizzer());
    ListService.Dispose();   // or whatever you're going to call it
}

Я видел, что это хорошая практика для веб-приложений. Мне было интересно, то же самое для приложений winform?

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

Помните, однако, что вы должны тщательно продумать свой дизайн. Что делать, если у вас есть регистратор и файл становится недоступным? Что делать, если прокси теряет связь? и т. д.

3 голосов
/ 30 марта 2012

Не знаю, как это делает C #, но в Java вам нужно создать приватный конструктор, чтобы люди не могли делать new ListService()

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