Ninject не создает новый экземпляр с аргументами конструктора в WCF - PullRequest
3 голосов
/ 30 марта 2011

Вот сценарий.У меня есть служба WCF, когда эта служба вызывается, она передает управление экземпляру другого класса (созданного с помощью Ninject).В этом классе мне нужно поработать, особенно с Entity Framework и репозиториями.Короче говоря, у меня объявлена ​​следующая привязка.

Bind<IGenericProductRepository>()
    .To<GenericProductRepository>()
    .WithConstructorArgument( "context", new StagingDataContext());

Когда я хочу использовать этот репозиторий, у меня есть следующее.

using (var genericProductRepository = IoC.Resolve<IGenericProductRepository>())

Проблема в том, что яполучить новый экземпляр genericProductRepository только в том случае, если это совершенно новый запрос, если метод вызывается несколько раз в одном и том же запросе, я получаю сообщение об ошибке, утверждающее, что контекст (контекст EF) уже удален, это потому, что кажется, что явернуть тот же экземпляр, который уже был расположен в операторе using.Чтобы объяснить это по-другому, с помощью тестового клиента Microsoft WCF, если я вызываю его в первый раз, код работает нормально, если я снова нажимаю кнопку вызова (без перезапуска тестового клиента, то есть того же запроса), он выдает эту ошибкуо том, что он уже был уничтожен.

Я пытался поиграться с различными "сферами", которые есть в Ninject, но, очевидно, я что-то упускаю.

Итак, мой основной вопрос: какЯ получаю новый репозиторий всякий раз, когда он попадает в эту строку, вместо того, чтобы использовать тот же?Буду очень признателен за помощь, я действительно стараюсь, чтобы моя компания приняла Ninject и бросила Spring.

1 Ответ

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

Посмотрите на свою привязку еще раз. Даже не зная о Ninject, вы должны заметить, что экземпляр вашего контекста создается ровно один раз во время определения привязки. Но то, что вы хотите, это иметь новый контекст при каждом решении. Лучше всего это сделать, не используя WithConstructorArgument и позволяя Ninject создать экземпляр. Поэтому вы должны определить дополнительную привязку для типа контекста. Если это невозможно по какой-то причине, вам нужно использовать ленивую версию WithConstructorArgument

WithConstructorArgument("context", ctx => new StagingDataContext())

Кроме того, вы можете попробовать расширение WCF для Ninject: https://github.com/ninject/ninject.extensions.wcf

Таким образом, вы можете избавиться от ServiceLocator как использование.

...