WCF: вопрос об экземплярах и параллелизме - PullRequest
0 голосов
/ 13 ноября 2010

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

1) Instancing: Single, Concurrency: Multiple, с общими данными, хранящимися в instance variable.

2) Instancing:Per-Call, Concurrency: несколько, с общими данными, хранящимися в static переменных.

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

1 Ответ

1 голос
/ 13 ноября 2010

Условно нет никакой разницы. Как вы сказали, в любом случае вам придется синхронизировать доступ к общим данным. Практически второй вариант лучше. Из полной книги по 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();
    }
}

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

...