Ninject.Mvc5不适用于单

时间:2015-06-02 08:07:51

标签: asp.net asp.net-mvc mono ninject ninject.web.mvc

关注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并且不适用于我的版本。

2 个答案:

答案 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软件包更新到最新版本。

https://www.nuget.org/packages/WebActivatorEx/

答案 1 :(得分:0)

事实证明,我的代码和ninject都不是罪魁祸首。 Mono(4.0.1)隐藏了一些错误,它会以某种方式引起Ninject的麻烦。

我使用每周构建记录here更新为单声道4.3,并且一切都很好。