我刚刚开始使用IoC容器,因此选择了Ninject。
经过几个小时的汗水和泪水,我仍然不知道如何使用Ninject来设置我的MVC3应用程序。
到目前为止,我有:
Global.asax.cs
public class MvcApplication : Ninject.Web.Mvc.NinjectHttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
DependencyResolver.SetResolver(new MyDependencyResolver(CreateKernel()));
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
protected override IKernel CreateKernel()
{
var modules = new [] { new ServiceModule() };
return new StandardKernel(modules);
}
}
ServiceModule.cs
internal class ServiceModule : NinjectModule
{
public override void Load()
{
Bind<IGreetingService>().To<GreetingService>();
}
}
MyDependencyResolver.cs
public class MyDependencyResolver : IDependencyResolver
{
private IKernel kernel;
public MyDependencyResolver(IKernel kernel)
{
this.kernel = kernel;
}
public object GetService(System.Type serviceType)
{
return kernel.TryGet(serviceType);
}
public System.Collections.Generic.IEnumerable<object> GetServices(System.Type serviceType)
{
return kernel.GetAll(serviceType);
}
}
GreetingService.cs
public interface IGreetingService
{
string Hello();
}
public class GreetingService : IGreetingService
{
public string Hello()
{
return "Hello from GreetingService";
}
}
TestController.cs
public class TestController : Controller
{
private readonly IGreetingService service;
public TestController(IGreetingService service)
{
this.service = service;
}
public ActionResult Index()
{
return View("Index", service.Hello());
}
}
每次我试图加载Index视图时,它要么抛出一个溢出异常,要么抛出一个HTTP404错误--如果我删除了所有的Ninject代码,它就能正常工作,有什么问题吗?
发布于 2010-12-05 23:52:28
您正在将自己的依赖项解析器与MVC扩展混合在一起。我建议要么使用自己的依赖解析器,要么使用MVC扩展,但不能两者兼而有之。当使用MVC扩展时,你必须使用OnApplicationStarted而不是Application_Start。
请参阅http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/并查看MVC扩展https://github.com/ninject/ninject.web.mvc源代码附带的SampleApplication。
此外,当您使用构建服务器的当前版本时,将不再使用该修复:http://teamcity.codebetter.com
更新:Ninject.MVC3
包继续更新,并针对MVC4 RTM (和RC)工作。详情请参见this page in the wiki。
https://stackoverflow.com/questions/4358395
复制相似问题