【发布时间】:2012-08-31 22:42:31
【问题描述】:
更新 - 请查看我的答案以获取此问题的解决方案的链接和说明
在我们开始之前,我知道这是一个非常常见的问题,我已经使用 Ninject 很多个月都没有问题,但现在它出现了,我无法找到解决办法。另外,不,到目前为止,Google 和 SO 上的结果都没有帮助我。
因此,考虑在 Windows Server 2008 R2 上的 Visual Studio 2012 的一个非常、非常、非常简单的原型 ASP.NET MVC 4 项目上运行的以下代码:
public class DefaultController : Controller {
private IGroupPrincipalRepository GroupPrincipalRepository { get; set; }
[Inject]
public DefaultController(
IGroupPrincipalRepository groupPrincipalRepository) {
this.GroupPrincipalRepository = groupPrincipalRepository;
}
}
这是NinjectWebCommon.cs RegisterServices 方法:
kernel.Bind(typeof(IGroupPrincipalRepository)).ToConstructor(
c =>
new GroupPrincipalRepository(new PrincipalContext(ContextType.Domain, "?", "?", "?", "?"))).InSingletonScope();
现在,这就是我使用 Ninject 的其他项目(但在 .NET 4 上是 ASP.NET MVC 3)的工作方式,据我所知,这是使一切正常工作所需要的。那么,为什么我突然得到 No parameterless constructor defined for this object. 异常?
更新
这是完整的NinjectWebCommon.cs 文件:
[assembly: WebActivator.PreApplicationStartMethod(typeof(App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(App_Start.NinjectWebCommon), "Stop")]
namespace App_Start {
using System;
using System.DirectoryServices.AccountManagement;
using System.Repositories.ActiveDirectory;
using System.Web;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using Ninject;
using Ninject.Web.Common;
public static class NinjectWebCommon {
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
public static void Start() {
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
}
public static void Stop() {
bootstrapper.ShutDown();
}
private static IKernel CreateKernel() {
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
return kernel;
}
private static void RegisterServices(
IKernel kernel) {
kernel.Bind(typeof(IGroupPrincipalRepository)).ToConstructor(
c =>
new GroupPrincipalRepository(new PrincipalContext(ContextType.Domain, "", "", "", ""))).InSingletonScope();
}
}
}
更新 - 请查看我的答案以获取此问题的解决方案的链接和说明
【问题讨论】:
-
您在哪里创建 DependecyResolver 并覆盖默认值?
-
我认为这就是
NinjectWebCommon.cs文件正在做的事情,如果不是,那么我猜答案是“不知道在哪里”。再说一次,我很困惑,因为我的其他项目都是这样工作的,我已经进行了两次和三次检查以确保我没有撒谎...... -
在 Ninject.MVC 包中有一个
NinjectMvcHttpApplicationPlugin负责处理DependecyResolver... 所以它应该可以工作吗?你如何安装 Ninject.MVC ?使用 Nuget? -
是的,使用 NuGet,最新版本然后我更改
NinjectWebCommon.cs文件,正如 Git 中心文档所说。我刚刚用一个新的 MVC 4 项目尝试了另一个测试,在一个注入的单个控制器中只有一个ActionResult。仍然因同样的问题而失败。 -
我尝试在我的本地计算机上使用 Visual Studio 2010、MVC 4、.NET 4 进行另一项测试,这次错误没有发生。我将假设罪魁祸首是 VS2012 或 .NET 4.5。以 .NET 4.0 为目标并不能解决问题。
标签: c# asp.net-mvc asp.net-mvc-4 ninject visual-studio-2012