我将和#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));
}
答案 0 :(得分:0)
InvalidOperationException:尝试创建时发生错误 控制器类型&#39; SportsStore.WebUI.Controllers.ProductController&#39;。 确保控制器具有无参数的公共构造函数
错误消息很明确:您的控制器没有无参数构造函数(由代码确认)。这当然是有意的,因为您需要IProductRepository。您只需要为IProductRepository提供绑定,以便Ninject知道如何创建此依赖项。
答案 1 :(得分:0)
问题解决了,原因是:永远不要在你的项目路径中使用该死的#符号。
Ninject,Visual studio或其他任何无法正确解析它且无法加载依赖项的内容。