我尝试在此代码中使用Ninject解析IContext。我有一个ContextProvider,它提供了由MySampleContext继承的DBContext。
protected virtual void Application_BeginRequest()
{
ContextProvider cp = new ContextProvider();
cp.SetCurrent(new MySampleContext());
}
或者以这种方式保持它会更好..?问题是我无法访问内核,因为它是在引导程序中创建的。
有什么想法吗?我想要做的是使用ninject而不是实例化mySampleContext来提供上下文
答案 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>();