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

本文关键字:程序 错误 实例 接口 创建 IOC MVC5 依赖 使用 | 更新日期: 2023-09-27 18:27:52

我正试图简单地使用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);
        }
    }

这是我的家庭控制器

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>();

它确实到此为止。。。。不知道发生了什么:(

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

通常不能将参数注入到操作方法中。

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

public class HomeController : Controller
{
    private readonly ITest test;
    public HomeController(ITest test)
    {
        this.test = this;
    }
    public ActionResult Index()
    {
        //use test here
        return View();
    }
}