Где хранить Ninject IKernel в веб-приложении? - PullRequest
6 голосов
/ 06 августа 2010

Я новичок в МОК в целом, и я немного пытаюсь понять, имеет ли смысл то, что я пытаюсь сделать.У меня есть приложение веб-форм, в котором я хочу создать один модуль, чтобы определить некоторые привязки для меня.Привязки будут использоваться для внедрения репозиториев в классы моего бизнес-менеджера, что позволит мне провести модульное тестирование бизнес-менеджеров.Также я хотел бы использовать контейнер для добавления контекста Entity Framework в мои репозитории таким образом, чтобы все они использовали один и тот же контекст для каждого http-запроса.Вот что мне интересно:

  1. Я понимаю, что мне нужно, чтобы один и тот же экземпляр ядра управлял созданием моих объектов и их временем жизни.Например, если я хочу сценарий типа «один на httprequest», мне нужно, чтобы экземпляр ядра был доступен в течение этого периода времени.Что если мне нужен синглтон?Тогда это должно быть как-то ограничено приложением.Итак, где именно я храню экземпляр IKernel?Кажется, что я мог бы сделать это статическим в моем Global.asax, это правильный подход и является ли безопасность потоков проблемой?

  2. Поскольку я использую Bind <> для определениямои привязки, как мне сделать определение в слое Web / UI, когда я не должен ссылаться на свой уровень доступа к данным из UI?Мои ссылки выглядят как .Web -> .Business -> DataAccess.Похоже, я хочу сказать ядру: «Эй, управляй моими экземплярами доступа к данным, но не имей ссылки на них во время компиляции».Такая привязка:


    //Any object requesting an instance of AdventureWorksEntities will get an instance per request
    Bind<AdventureWorksEntities>().ToSelf().InRequestScope();

Я чувствую, что могу подойти к этому неправильно, спасибо.

Ответы [ 2 ]

1 голос
/ 09 августа 2010

Часть 1 - взгляните на расширение Ninject.Web - оно поддерживает ядро ​​на уровне приложения. После этого вы также можете управлять другими ресурсами, у которых срок службы короче.

Кроме того, здесь можно найти вопросы и примеры по управлению EF и L2S DataContext с Ninject и DI в целом (они появятся [в последние несколько недель)

ОБНОВЛЕНИЕ: Этот ответ на другой вопрос из того же ОП гораздо конкретнее (есть класс KernelContainer с .Inject( object) и .Kernel)

1 голос
/ 06 августа 2010

Это действительно зависит от сложности вашего веб-приложения.

Похоже, у вас есть бизнес и уровень доступа к данным; Лично у меня был бы слой «инфраструктуры», где я буду хранить свой репозиторий DI и вспомогательные классы.

...