Создайте одноэлементный класс для доступа к ServiceSecurityContext.Текущий.WindowsIdentity

У меня есть класс в моей службе WCF, который использует ServiceSecurityContext.Текущий.WindowsIdentity для получения удостоверения клиента. Все это хорошо работает. Я хотел бы иметь класс в качестве синглтона, чтобы я мог получить доступ к нему в любом месте, не создавая новые экземпляры повторно. InstanceContextModeЯ использую есть PerSessionи ConcurrencyModeесть Single.

Как я могу это сделать и должен ли я беспокоиться о любых gotchas? Кстати класс использует олицетворение и загружает информацию из базы данных для входа в домен и кэширует ее на время работы WCF.

1 ответ

  1. WCF автоматически создаст одноэлемент со следующими параметрами:

    InstanceContextMode = InstanceContextMode.Single
    

    Single: один InstanceContext (и, следовательно, объект Службы)
    обрабатывает все клиентские запросы в течение срока службы приложения.

    ConcurrencyMode = ConcurrencyMode.Multiple
    

    ConcurrencyMode.Несколько будет поддерживать несколько одновременных пользователей.

    Подробнее об этом здесь:

    https://msdn.microsoft.com/en-us/library/ms731193 (v=110).aspx

    По моему опыту, внедрения синглетов следует избегать, так как могут возникнуть проблемы с производительностью, особенно если они не многопоточны. Даже если вы используете ConcurrencyMode.Multiple-нет никакой гарантии синхронизации потоков (вы должны справиться с этим самостоятельно).

    Подробнее о синхронизации данных для многопоточности