gpt4 book ai didi

c# - ASP.NET MVC 4 Ninject MVC 4 找不到类型 'App.Controller' 的默认构造函数

转载 作者:行者123 更新时间:2023-11-30 17:45:29 24 4
gpt4 key购买 nike

我在 Ubuntu 14.04 LTS(在 IDE 中运行时为 Mono 3.10.0 mod-mono-server4/xsp)上的 Xamarin Studio/modevelop-opt 中设置了一个新的 ASP.NET MVC 4 应用程序。安装的包是:

Install-Package Microsoft.AspNet.Mvc -Version 4.0.40804
  • 微软.AspNet.MVC
  • Microsoft.AspNet.Razor
  • Microsoft.AspNet.WebPages
  • Microsoft.Web.Infrastructure

我还必须安装优化框架:

Install-Package Microsoft.AspNet.Web.Optimization

我选择从 NuGet 实现 IoC 容器 Ninject 并安装了以下包:

Install-Package Ninject.Mvc4
  • 注入(inject)
  • Ninject.MVC4
  • Ninject.Web.Common.WebHost
  • Ninject.Web.Common

因为我安装了 Ninject.Mvc4,它在 App_Start 中为我创建了一个名为 NinjectWebCommon.cs 的好文件

这是创建内核的方法:

    private static IKernel CreateKernel ()
{
var kernel = new StandardKernel ();
try {
kernel.Bind<Func<IKernel>> ().ToMethod (ctx => () => new Bootstrapper ().Kernel);
kernel.Bind<IHttpModule> ().To<HttpApplicationInitializationHttpModule> ();

RegisterServices (kernel);
return kernel;
} catch {
kernel.Dispose ();
throw;
}
}

注册服务方法如下:

    private static void RegisterServices (IKernel kernel)
{
kernel.Bind<IResourceEntryService> ().To<ResourceEntryService> ();

var modules = new List<INinjectModule> {
new ConfigModule (),
new RepositoryModule (),
new LoggingModule ()
};

kernel.Load (modules);
}

资源条目服务和接口(interface):

public interface IResourceEntryService
{
IEnumerable<ResourceEntry> GetResourceEntries ();

IEnumerable<ResourceEntry> GetResourceEntriesByNameAndCulture (string name, string culture);
}

public class ResourceEntryService : IResourceEntryService
{
IResourceEntryRepository _resourceEntryRepository;

public ResourceEntryService (IResourceEntryRepository resourceEntryRepository)
{
_resourceEntryRepository = resourceEntryRepository;
}

#region IResourceEntryService implementation

public System.Collections.Generic.IEnumerable<ResourceEntry> GetResourceEntries ()
{
IEnumerable<ResourceEntry> resourceEntries = _resourceEntryRepository.GetResourceEntries ();
return resourceEntries;
}

public System.Collections.Generic.IEnumerable<ResourceEntry> GetResourceEntriesByNameAndCulture (string name, string culture)
{
IEnumerable<ResourceEntry> resourceEntries = _resourceEntryRepository.GetResourceEntriesByNameAndCulture (name, culture);
return resourceEntries;
}

#endregion
}

将新模型对象传递到 View 中的资源条目 Controller :

public class ResourceEntryController : Controller
{
IResourceEntryService _resourceEntryService;

public ResourceEntryController (IResourceEntryService resourceEntryService)
{
_resourceEntryService = resourceEntryService;
}

public ActionResult Index ()
{
ResourceEntryViewModel viewModel = new ResourceEntryViewModel ();

return View (viewModel);
}
}

这是我的 ~/Views/ResourceEntry/Index.cshtml 文件:

@model App.Web.UI.ViewModels.ResourceEntryViewModel

<h1>Resource Page</h1>

所以现在一切看起来都还好吧?错了!当我尝试查看该页面时收到以下错误消息。

System.MissingMethodException
Default constructor not found for type App.Web.UI.Controllers.ResourceEntryController

at System.Activator.CreateInstance (System.Type type, Boolean nonPublic) [0x00094] in /usr/src/packages/BUILD/mcs/class/corlib/System/Activator.cs:326
at System.Activator.CreateInstance (System.Type type) [0x00000] in /usr/src/packages/BUILD/mcs/class/corlib/System/Activator.cs:222
at System.Web.Mvc.DefaultControllerFactory+DefaultControllerActivator.Create (System.Web.Routing.RequestContext requestContext, System.Type controllerType) [0x00000] in <filename unknown>:0

Version Information: 3.10.0 (tarball Sat Oct 4 16:28:24 UTC 2014); ASP.NET Version: 4.0.30319.17020
Powered by Mono

任何人都知道如何为在单堆栈上运行的 MVC 4 应用程序设置 Ninject。

我在 google 和 stackoverlow 上进行了很好的搜索,但无法真正找到明确的答案。一切都链接到 Web API,我对 Web API 不是很感兴趣,因为如果涉及到它,我将使用 ServiceStack。

我只想让这个 Web 应用程序正常工作。有人有什么建议吗?

更新:2014 年 12 月 20 日

在 windows 下运行良好,但在 Ubuntu 下运行不佳

我创建了一个简单的应用程序,可以在这里找到:

Sample Application

有什么想法吗?

2014 年 12 月 21 日更新

我尝试了另一种 IoC 容器的实现。

同样的事情发生了,我认为这可能是一个 Mono MVC 4 的东西。仍然不知道为什么。

2014 年 12 月 22 日更新

看起来 App_Start 没有在启动时被调用。

我在 CreateKernelRegisterServices 中执行了 Console.WriteLine,但没有打印出任何内容。

我可以得到 SimpleInjector通过在 Global.ascx.cs 文件中配置容器来工作。如果在 App_Start 中使用顶部的以下行对其进行初始化,它将无法工作。

[assembly: WebActivator.PostApplicationStartMethod (typeof(App.Web.UI.App_Start.SimpleInjectorInitializer), "Initialize")]

请问是不是 WebActivator 与 Mono 有问题。

最佳答案

查看堆栈跟踪,我可以在底部看到 DefaultControllerFactory,它将在内部实例化 Controller 实例,例如:

return Activator.CreateInstance(YourControllerType);

这个调用会变得脾气暴躁,因为您的 Controller 没有无参数的构造函数,并且您没有提供参数值列表以供它找到要使用的合适的构造函数...因此出现异常。此外,您不想提供参数列表,那将是不灵活的并且违背了 IoC 的目的,您希望您的 IoC 内核而不是创建实例。

现在,我没有使用 Ninject 的经验,所以可能有更“Ninjecty”的方式来执行此操作(如果您知道那是什么,请添加到此 :) 但您需要创建自己的 DefaultControllerFactory,它可以确定类型并使用 Ninject 来创建它。像这样:

// NOTE: Something like this, not exactly, I've not used Ninject!

public class YourControllerFactory : DefaultControllerFactory
{
public override IController CreateController(RequestContext requestContext, string controllerName)
{
var type = GetControllerType(requestContext, controllerName);

return kernel.Get(type);
}
}

在 Global.asax 中注册:

ControllerBuilder.Current.SetControllerFactory(new YourControllerFactory());

现在您可以控制实例化过程了!

关于c# - ASP.NET MVC 4 Ninject MVC 4 找不到类型 'App.Controller' 的默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27560521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com