WCF: вопрос об экземплярах и параллелизме

Скажем, у меня есть служба WCF, которая имеет доступ к некоторым данным, которые совместно используются несколькими клиентами. В чем разница между этими двумя настройками:

1) Экземпляр: один, параллелизм: несколько, с общими данными, хранящимися в переменных экземпляра.

2) Создание экземпляров: для каждого вызова, параллелизм: множественный, с общими данными, хранящимися в статических переменных.

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


person Ben    schedule 12.11.2010    source источник


Ответы (1)


По идее разницы нет. Как вы сказали, в любом случае вам придется синхронизировать доступ к общим данным. Практически второй вариант лучше. Из исчерпывающей книги по WCF Программирование служб WCF автор Юваль Лоуи:

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

Я использую вариант № 2 для своего проекта. Сама служба WCF — это просто тонкий фасад статических методов классов, в которых выполняется работа. Например,

public class Logger
{
    private static List<Logger> _loggers = new List<Logger>();
    private static object _sync = new object();

    public static void Start()
    {
        Logger logger = new Logger();
        logger.Start();

        lock (_sync) {
            _loggers.Add( logger );
        }
    }

    private Logger()
    {
        // construct the Logger object...
    }

    private void Start()
    {
        // start the logger here...
    }
}

public class LoggingService : ILoggingService
{
    public void StartLogger()
    {
        Logger.Start();
    }
}

Очевидно, я опустил многие детали, но это показывает общую идею.

person Matt Davis    schedule 13.11.2010
comment
Хорошая ссылка, хотя мне до сих пор не ясно, почему вариант 2 обычно является лучшим подходом. Есть ли ситуация, когда вариант 1 менее гибкий или не такой эффективный? - person Ben; 13.11.2010
comment
В книге говорится, что вариант 2 больше подходит для обработки транзакций, чем вариант 1. Для меня это имеет смысл, но поскольку это бесполезно для моего проекта, я не исследовал этот аспект. - person Matt Davis; 13.11.2010