首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MVC3 + Ninject -如何操作?

MVC3 + Ninject -如何操作?
EN

Stack Overflow用户
提问于 2010-12-05 18:44:52
回答 1查看 17.3K关注 0票数 16

我刚刚开始使用IoC容器,因此选择了Ninject。

经过几个小时的汗水和泪水,我仍然不知道如何使用Ninject来设置我的MVC3应用程序。

到目前为止,我有:

Global.asax.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
public interface IGreetingService
{
    string Hello();
}

public class GreetingService : IGreetingService
{
    public string Hello()
    {
        return "Hello from GreetingService";
    }
}

TestController.cs

代码语言:javascript
复制
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代码,它就能正常工作,有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4358395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档