Разрешить IContext с Ninject? - PullRequest
       1

Разрешить IContext с Ninject?

1 голос
/ 18 сентября 2011

Я пытаюсь разрешить IContext с Ninject в этом коде.У меня есть ContextProvider, который предоставляет DBContext, который наследуется MySampleContext.

protected virtual void Application_BeginRequest()
{
     ContextProvider cp = new ContextProvider();
     cp.SetCurrent(new MySampleContext());
}

Или было бы лучше, чтобы я сохранил его таким образом ...?Проблема в том, что я не могу получить доступ к Ядру, так как оно создано в начальной загрузке.

Есть идеи?Что я хочу сделать, это предоставить контекст, используя ninject вместо экземпляра mySampleContext

Ответы [ 3 ]

3 голосов
/ 19 сентября 2011

Свяжите свой контекст в области запроса, и конструктор вставит его туда, где он вам нужен.Таким образом, он создается только тогда, когда он где-то используется.

Bind<DbContext>().To<MySampleContext>().InRequestScope();

Если вам действительно нужно установить его в ContextProvider, добавьте действие активации

.OnActivation(i => new ContextProvider().SetCurrent(i))
0 голосов
/ 18 сентября 2011

Весь смысл наличия IDependencyResolver, поддерживающего DI и отделяющего ваши приложения от IoC, который вы используете. Если вам когда-либо придется реорганизовать свой код для использования другого IoC (например, Structuremap), у вас не будет зависимостей от Ninject во всем коде.

Если вы находитесь в ситуации, когда вы не можете использовать инжекцию конструктора, вам нужно вызвать статический DependencyResolver в System.Web.Mvc следующим образом:

var context = DependencyResolver.Current.GetService<IContext>();
0 голосов
/ 18 сентября 2011

Если предложите ваши 2 решения. Если вы используете ASP.NET MVC 3, вы, вероятно, могли бы использовать DepencyResolver

DepencyResolver.Current.GetService<IContext>();

Или вы также можете объявить статическое свойство в вашем MvcApplication (Global.asax), например

public static IKernel CurrentKernel {get;set;}

И в вашем загрузчике, где вы начинаете свое ядро ​​

var kernel = new StandardKernel();
// Bindings here...
MvcApplication.CurrentKernel = kernel;

И если у вас возникли проблемы из-за того, что ваше ядро ​​еще не загружено в BeginRequest, я предлагаю вам обработать следующее событие вместо BeginRequest

Application_PreRequestHandlerExecute

Надеюсь, это поможет.

...