使用IOC容器作为MVC5的依赖解析器抛出'无法创建接口的实例'错误

时间:2014-10-25 14:59:41

标签: c# asp.net-mvc ninject

我试图简单地使用IOC容器(目前为ninject)作为MVC5的依赖解析器。 这曾经在MVC4,visual studio 2012中运行良好,但是现在使用VS2013和MVC5,我只是不能让解析器在我的控制器中注入一个依赖。这不是ninject特有的,我试过了SimpleInjector和Unity也是 - 同样的错误

我只想在家里的控制器中注入这个课程。

    public interface ITest
    {
        void dummyMethod();
    }


     public class Test : ITest
    {
            public void dummyMethod()
            {
            };
    }

这是依赖性解析器

 public class NinjectDependencyResolver : IDependencyResolver
    {
        private IKernel kernel;
        public NinjectDependencyResolver()
        {
            kernel = new StandardKernel();
            AddBindings();
        }
        public object GetService(Type serviceType)
        {
        return kernel.TryGet(serviceType);
        }


            public IEnumerable<object> GetServices(Type serviceType)
            {
                 return kernel.GetAll(serviceType);
            }
            private void AddBindings()
            {
                kernel.Bind<ITest>().To<Test>();

            }
    }

这是global.asax.cs

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            DependencyResolver.SetResolver(new NinjectDependencyResolver());
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }

这是我的HomeController

public class HomeController : Controller
{
    public ActionResult Index(ITest test)
    {
        return View();
    }
}

但是当我跑步时,我一直在

Server Error in '/' Application.
Cannot create an instance of an interface. 

我也尝试过创建一个全新的项目(MVC 5) - 同样的错误

我尝试过MVC5,然后又升级到5.2.2。同样的错误

任何帮助非常感谢。我认为解析器永远不会被某种原因调用,即使我在

处设置断点
  kernel.Bind<ITest>().To<Test>();

它确实就此止步......不知道发生了什么:(

1 个答案:

答案 0 :(得分:3)

通常,您无法将参数注入操作方法。

您需要在constroller的构造函数中注入依赖项:

public class HomeController : Controller
{
    private readonly ITest test;

    public HomeController(ITest test)
    {
        this.test = this;
    }

    public ActionResult Index()
    {
        //use test here
        return View();
    }
}