ASP.NET MVC + NinjectWebCommon

时间:2017-02-13 04:25:45

标签: c# asp.net asp.net-mvc ninject ninject.web.mvc

我将和#34; Freeman pro asp.net mvc 5"书(第7章)。

问题是:

NinjectWebCommon.cs中的代码永远不会执行,因此我不断收到错误"没有为此对象定义无参数构造函数。"看起来Web服务器根本看不到这个文件,我在每个方法上都有断点,在运行应用程序时从不接触任何一个。

首先,我按照书中的所有说明,自己完成了项目。我收到了这个错误。

其次,我从官方网站下载了代码示例,打开了项目并尝试运行它。我仍然有这个错误。

第三,我创建了一个新的,绝对简单的mvc5 + ninject应用程序,但我仍然遇到了这个错误。

有什么想法吗?

所以要明确,只需这些步骤: 我要前往http://www.apress.com/us/book/9781430265290 2.我正在下载源代码 3.我将在VS 2015的第7章中打开源代码示例 4.在不对代码进行任何更改的情况下,我按F5并在浏览器中享受错误: [MissingMethodException:没有为此对象定义无参数构造函数。] .. [InvalidOperationException:尝试创建类型为' SportsStore.WebUI.Controllers.ProductController'的控制器时发生错误。确保控制器具有无参数的公共构造函数。]

控制器代码很简单:

    public class ProductController : Controller
{
    private IProductRepository repository;

    public ProductController(IProductRepository repository)
    {
        this.repository = repository;
    }

    public ViewResult List()
    {
        return View(repository.Products);
    }
}

接下来,我在代码中有自己的依赖项解析器实现:

public class NinjectDependencyResolver : IDependencyResolver
{
    private IKernel kernel;

    public NinjectDependencyResolver(IKernel kernelParam)
    {
        kernel = kernelParam;
        AddBindings();
    }

    public object GetService(Type serviceType)
    {
        return kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return kernel.GetAll(serviceType);
    }

    private void AddBindings()
    {
        Mock<IProductRepository> mock = new Mock<IProductRepository>();

        mock.Setup(m => m.Products).Returns(new List<Product>
        {
            new Product {Name = "Football", Price = 25},
            new Product {Name = "Surf board", Price = 179},
            new Product {Name = "Running shoes", Price = 95}
        });

        kernel.Bind<IProductRepository>().ToConstant(mock.Object);
    }
}

最后,我在NinjectWebCommon类中使用它,如下所示:

    private static void RegisterServices(IKernel kernel)
    {
        System.Web.Mvc.DependencyResolver.SetResolver(new Infrastructure.NinjectDependencyResolver(kernel));
    } 

2 个答案:

答案 0 :(得分:0)

  

InvalidOperationException:尝试创建时发生错误   控制器类型&#39; SportsStore.WebUI.Controllers.ProductController&#39;。   确保控制器具有无参数的公共构造函数

错误消息很明确:您的控制器没有无参数构造函数(由代码确认)。这当然是有意的,因为您需要IProductRepository。您只需要为IProductRepository提供绑定,以便Ninject知道如何创建此依赖项。

答案 1 :(得分:0)

问题解决了,原因是:永远不要在你的项目路径中使用该死的#符号。

Ninject,Visual studio或其他任何无法正确解析它且无法加载依赖项的内容。