Объем окружающего контекста Поставщик экземпляра WCF - PullRequest
0 голосов
/ 26 января 2019

Я намерен использовать контекст окружения в моем проекте, который описан в этом местоположении . Я клиент-серверное приложение, клиенты подключены службами WCF. Теперь вопрос заключается в том, как реализовать поставщик экземпляров WCF. Подход, который я пробовал, всегда выдает сообщение об ошибке «System.InvalidOperationException: экземпляры DbContextScope должны быть расположены в том порядке, в котором они были созданы!» когда контекст должен быть удален.

Кто-нибудь имеет решение для управления этим?

Код, полученный от моего провайдера экземпляра:

public class MyInstanceProvider<T> : IInstanceProvider, IContractBehavior where T : class
{
    DbContextScopeFactory _dbContextScopeFactory;
    Dictionary<int, IDbContextScope> _Contexts = new Dictionary<int, IDbContextScope>();

    public MyInstanceProvider( DbContextScopeFactory dbContextScopeFactory )
    {
        _dbContextScopeFactory = dbContextScopeFactory;
    }

    public object GetInstance( InstanceContext instanceContext )
    {
        IDbContextScope contextScope = _dbContextScopeFactory.Create();
        _Contexts[instanceContext.GetHashCode()] = contextScope;
        var _Repository = new RepositoryFactory<T>().GetInstance();

        return _Repository;
    }

    public object GetInstance( InstanceContext instanceContext, Message message )
    {
        return GetInstance( instanceContext );
    }

    public void ReleaseInstance( InstanceContext instanceContext, object instance )
    {
        var hashCode = instanceContext.GetHashCode();
        if (_Contexts.ContainsKey( hashCode ))
        {
            var contextScope = _Contexts[hashCode];
            contextScope.Dispose();
            _Contexts.Clear();
        }
    }

...

1 Ответ

0 голосов
/ 28 января 2019

В вашем коде есть три потенциальных проблемы.

  1. Неправильно использовать instanceContext.GetHashCode() в качестве ключа словаря - хеш-коды не гарантируют, что они уникальны.Просто используйте instanceContext.

  2. В методе ReleaseInstance вы проверяете, есть ли в словаре правильный ключ, располагаете contextScope, а затем очищаете весь словарь (_Contexts.Clear()).Я думаю, вам следует заменить _Contexts.Clear() на _Contexts.Remove.

  3. Вы используете обычный Dictionary, в то время как ваш код может выполняться в несколько потоков WCF.Лучше использовать ConcurrentDictionary.

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