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 包更新到最新版本。
事实证明,我的代码和 ninject 都不是罪魁祸首。 Mono (4.0.1) 有隐藏的错误,它会以某种方式导致 Ninject.
出现问题
我使用记录在案的每周构建更新到 mono 4.3 here,一切都恢复正常了。
我正在按照 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 包更新到最新版本。
事实证明,我的代码和 ninject 都不是罪魁祸首。 Mono (4.0.1) 有隐藏的错误,它会以某种方式导致 Ninject.
出现问题我使用记录在案的每周构建更新到 mono 4.3 here,一切都恢复正常了。