Ninject,Linq to Sql,请求每个控制器的范围而不注入

时间:2011-01-18 21:07:54

标签: ninject

我最近看到这篇文章标题为: Linq to Sql和ASP.NET MVC - DataContext Per Request 在这个链接: http://www.jeremyskinner.co.uk/2010/01/31/linq-to-sql-and-asp-net-mvc-datacontext-per-request/

我想使用ninject而不是structuremap来设置它,最好使用新的mvc 3依赖解析器,因为我正在使用mvc 3 rtm。

文章的相关部分是:

首先,您需要通过调用Global.asax中的ObjectFactory.Configure来配置StructureMap,并传入自定义的Registry实例:

protected void Application_Start() {
 RegisterRoutes(RouteTable.Routes);

 ObjectFactory.Configure(cfg => {
  cfg.AddRegistry(new MyRegistry());
 });
}

MyRegistry的代码如下所示:

public class MyRegistry : Registry {
 public MyRegistry() {
  For<BlogDataContext>()
   .HttpContextScoped()
   .Use(c => new BlogDataContext());

  Scan(scan => {
   scan.AddAllTypesOf<Controller>();
  });
 }
}

这里我告诉StructureMap为每个HTTP请求创建一个BlogDataContext实例,并使用容器注册每个Controller实例。

接下来,我们需要告诉MVC使用StructureMap来实例化我们的控制器。这可以通过创建自定义ControllerFactory来完成:

public class StructureMapControllerFactory : DefaultControllerFactory {
 protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
  return (IController) ObjectFactory.GetInstance(controllerType);
 }
}

然后我们可以用Application_Start中的StructureMapControllerFactory替换DefaultControllerFactory:

protected void Application_Start() {
 RegisterRoutes(RouteTable.Routes);

 ObjectFactory.Configure(cfg => {
  cfg.AddRegistry(new MyRegistry());
 });

 ControllerBuilder.Current.SetControllerFactory(
  new StructureMapControllerFactory());
}

我想用ninject 2.0而不是结构图做同样的事情。我正在使用ninject mvc3构建一个mvc 3站点。我从nuget下载了ninject mvc 3软件包,我在我的解决方案中有这个文件来处理ninject的连接。 AppStart_NinjectMVC3.cs

我不想使用structurmap,我知道可以使用ninject完成相同的设置,但我不确定如何连接它。

谢谢。

1 个答案:

答案 0 :(得分:2)

我宁愿使用https://github.com/ninject/ninject.web.mvc的ninject项目中的官方mvc3扩展名。它附带了一个完整的示例应用程序,展示了如何连接mvc3应用程序。