2014-02-06 3 views
1

У меня есть слой репозитория, где они берут DbContext в конструктор. Я использую InCallScope, но экземпляр dbcontext, похоже, отличается в репозиториях. Вот код:Ninject - InCallScope возвращает разные экземпляры для инжектированных объектов

Bind<DbContext>().ToMethod(ctx =>new TaCertoEntities()).InCallScope(); 
Bind<IContratacaoRepository>().To<ContratacaoRepository>(); 

using (var context = Ioc.Container.Get<DbContext>()) 
     { 
      Ioc.Container.Get<IContratacaoRepository>().Insert(xxx); 

      context.Save(); 
     } 

Что я делаю неправильно?

Спасибо!

ответ

4

Каждый раз, когда вы запрашиваете Ядро для обслуживания, используя этот IoC.Container.Get<T>, вы получите другой экземпляр, если используете InCallScope(). Это то, что вы делаете неправильно.

Вам следует избегать использования этого Service Locator anti-pattern. Этот симптом, с которым вы сталкиваетесь, является явно одним побочным эффектом этого анти-шаблона: вы не знаете, где находится ваш Состав Корень есть.

Без определения вашего корня композиции использование областей видимо бесполезно. При запросе новых экземпляров через Service Locator каждый раз, когда вам нужна зависимость, ядро ​​не может угадать, как разрешить области, и вы обязательно столкнетесь с такой проблемой.

Если вы используете приложение MVC/WebAPI, ваш контроллер, безусловно, будет точкой активации для вашего графа объектов, так как он будет зависеть от зависимостей. Но вы должны оставить это в Ninject, чтобы это работало для вас.

Пакет Nuget Ninject.MVC3 автоматически настраивает ваше веб-приложение для инъекций. Или, если вы не используете веб-приложение, пожалуйста, предоставьте еще несколько примеров кода, чтобы я мог помочь вам определить, что ваш корень состава и как области могут помочь вам решить проблему, с которой вы столкнулись.