关注you-tube的视频教程,了解如何使用ASP.Net制作网络应用。在那里教学的人使用的是Windows和Visual Studio。我在Ubuntu 14.04和Monodevelop上。一切都已设置并运行,但Ninject(3.2.0.0)不起作用。
从NuGet安装后,它创建的文件NinjectWebCommon.cs
具有类NinjectWebCommon
。下面是我的RegisterServices
方法(根据导师)应该将我的列表注入控制器。我已经测试并且方法被调用肯定但是当我尝试访问我的/ Product / List时出现错误:
Application Exception
System.MissingMethodException
Default constructor not found for type OnlineShopping.WebUI.Controllers.ProductController
Description: HTTP 500.Error processing request.
Details: Non-web exception. Exception origin (name of application or object): mscorlib.
Exception stack trace:
at System.Activator.CreateInstance (System.Type type, Boolean nonPublic) [0x000a9] in <filename unknown>:0
at System.Activator.CreateInstance (System.Type type) [0x00000] in <filename unknown>:0
at System.Web.Mvc.DefaultControllerFactory+DefaultControllerActivator.Create (System.Web.Routing.RequestContext requestContext, System.Type controllerType) [0x00015] in <filename unknown>:0
Version Information: 4.0.1 (tarball Tue May 12 15:39:23 UTC 2015); ASP.NET Version: 4.0.30319.17020
注射似乎根本没有发生,我不知道为什么。我是ASP和.Net世界的新手,所以我可能会遗漏一些基本的东西。
这是RegisterServices
方法:
private static void RegisterServices(IKernel kernel)
{
Mock<IProductRepository> mock = new Mock<IProductRepository> ();
mock.Setup (m => m.Products).Returns (new List<Product> {
new Product{Name="Kilimanjaro Water", Price=1500},
new Product{Name="Azam Cake", Price=200},
new Product{Name="Huawei Y530", Price=195000},
});
kernel.Bind<IProductRepository> ().ToConstant(mock.Object);
}
这是我的控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using OnlineShopping.Domain.Abstract;
namespace OnlineShopping.WebUI.Controllers
{
public class ProductController : Controller
{
private readonly IProductRepository repository;
public ProductController(IProductRepository repo)
{
repository = repo;
}
public ViewResult List()
{
return View (repository.Products);
}
}
}
IProductRepository代码
using System;
using System.Collections.Generic;
using OnlineShopping.Domain.Entities;
namespace OnlineShopping.Domain.Abstract
{
public interface IProductRepository
{
IEnumerable<Product> Products{ get; }
}
}
注意:我已经尝试了我可以在谷歌找到的所有解决方案(因此如此)但我失败了。许多并不代表我的体验(虽然基本错误是相同的),而其他人则使用旧版本的Ninject并且不适用于我的版本。
答案 0 :(得分:1)
Ninject.Web.Common是Ninject.MVC5的依赖项,它是一个很好的小工具,可以让你的DI快速工作而不会过多地修改你的源代码。
不幸的是,这依赖于ASP.NET的一个小“技巧”来预装程序集并在程序集绑定期间执行它的启动代码,但我不认为这在Mono中可以正常工作。
还有另一个名为Ninject.Mono.Web.Common Ninject.Mono的项目,我相信这是一个解决方法。但是,这是一个比2012年更旧版本的3.0.x,我不建议使用它。
https://www.nuget.org/packages/Ninject.Mono.Web.Common/
您可以通过不使用Ninject.Web.Common来避免这种情况,而是在启动时手动配置ninject。
编辑:
看起来你需要至少2.0M版本的WebActivatorEx才能使用Mono,因为之前的版本没有。确保将nuget软件包更新到最新版本。
答案 1 :(得分:0)
事实证明,我的代码和ninject都不是罪魁祸首。 Mono(4.0.1)隐藏了一些错误,它会以某种方式引起Ninject的麻烦。
我使用每周构建记录here更新为单声道4.3,并且一切都很好。