使用Ninject解析IContext?

时间:2011-09-18 16:27:57

标签: asp.net-mvc-3 ninject

我尝试在此代码中使用Ninject解析IContext。我有一个ContextProvider,它提供了由MySampleContext继承的DBContext。

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

或者以这种方式保持它会更好..?问题是我无法访问内核,因为它是在引导程序中创建的。

有什么想法吗?我想要做的是使用ninject而不是实例化mySampleContext来提供上下文

3 个答案:

答案 0 :(得分:3)

将您的Context绑定在请求范围内,构造函数将其注入您需要的位置。这种方式只有在某处使用时才会创建。

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

如果您确实需要在ContextProvider上设置它,请添加激活操作

.OnActivation(i => new ContextProvider().SetCurrent(i))

答案 1 :(得分:0)

如果建议你的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

希望它有所帮助。

答案 2 :(得分:-3)

让IDependencyResolver支持DI并将您的应用程序与您正在使用的IoC分离。如果您必须重构代码以使用不同的IoC(例如Structuremap),那么您将不会在代码中依赖Ninject。

如果您处于无法使用构造函数注入的情况,则需要在System.Web.Mvc中调用静态DependencyResolver,如下所示:

var context = DependencyResolver.Current.GetService<IContext>();