Ninject.Mvc5 不适用于单声道

Ninject.Mvc5 does not work with mono

我正在按照 you-tube 的视频教程使用 ASP.Net 制作网络应用程序。在那里教书的人正在使用 Windows 和 Visual Studio。我在 Ubuntu 14.04 和 Monodevelop。一切都已设置,运行 但 Ninject (3.2.0.0) 不起作用。

从 NuGet 安装后,它创建了文件 NinjectWebCommon.cs 有 class 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; }
    }
}

注意:我已经尝试了在 google 上可以找到的所有解决方案(因此如此),但我失败了。许多不代表我的经历(虽然基本错误是相同的)和其他人在 Ninject 的旧版本中并且不适用于我的版本。

Ninject.Web.Common 是 Ninject.MVC5 的依赖项,它是一个不错的小实用程序,可以让您的 DI 快速运行而无需过多修改您的源代码。

不幸的是,这依赖于 ASP.NET 的一小部分 "trick" 来预加载程序集并在程序集绑定期间执行它的启动代码,但我认为这在 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.0.4 版的 WebActivatorEx 才能与 Mono 一起使用,因为以前的版本不需要。确保将 nuget 包更新到最新版本。

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

事实证明,我的代码和 ninject 都不是罪魁祸首。 Mono (4.0.1) 有隐藏的错误,它会以某种方式导致 Ninject.

出现问题

我使用记录在案的每周构建更新到 mono 4.3 here,一切都恢复正常了。