Привязка Ninject Di с использованием службы WCF - PullRequest
3 голосов
/ 11 октября 2011

Я недавно создал сервисную библиотеку WCF.Я планирую разместить его в IIS.Поскольку я хочу повторно использовать свой слой репозитория, я решил использовать Ninject и в своем сервисе WCF (я использую его в других проектах решения).

Я установил расширения Ninject Wcf.Я настроил его с помощью NinjectServiceHostFactory в файле SVC.Я добавил файл Global.asax для переопределения CreateKernel (), который наследуется от NinjectWcfApplication, но я не уверен, правильно ли я использую привязки.Сначала я начал с:

Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();

Но я быстро понял, что это не работает, так как данные не были сохранены в моей базе данных.Похоже, что служба WCF не использует конвейер ASP.NET.Я попробовал и то и другое, чтобы убедиться, что мои данные переданы в базу данных:

Bind<IUnitOfWork>().To<UnitOfWork>().InThreadScope();
Bind<IUnitOfWork>().To<UnitOfWork>().InTransientScope();

Не повезло.Затем я решил попробовать:

Bind<IUnitOfWork>().To<UnitOfWork>().InSingletonScope();

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

Bind<IUnitOfWork>().To<UnitOfWork>().InScope(c => OperationContext.Current);

Это работает, но верно ли это?Я хочу кое-что напомнить InRequestScope для приложения MVC.Каждый запрос к службе должен получить собственный контекст базы данных.

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Предлагаю взглянуть на последнюю сборку с CI-сервера. http://teamcity.codebetter.com

Вам нужен Ninject, Ninject.Web.Common, Ninject.Extensions.Wcf

В этой версии вы можете использовать InRequestScope для Wcf.

1 голос
/ 12 октября 2011

Я новичок в Ninject, но могу вам сказать, что OperationContext.Current эквивалентно HttpContext.Current для веб-приложения.

Итак, ваша первая мысль - использовать .InRequestScope(); (что эквивалентно.InScope(c => HttpContext.Current);)

, поэтому я предполагаю, что использование .InScope(c => OperationContext.Current); для WCF довольно правильно.

...