- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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
我还必须安装优化框架:
Install-Package Microsoft.AspNet.Web.Optimization
我选择从 NuGet 实现 IoC 容器 Ninject 并安装了以下包:
Install-Package Ninject.Mvc4
因为我安装了 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 下运行不佳
我创建了一个简单的应用程序,可以在这里找到:
有什么想法吗?
2014 年 12 月 21 日更新
我尝试了另一种 IoC 容器的实现。
同样的事情发生了,我认为这可能是一个 Mono MVC 4 的东西。仍然不知道为什么。
2014 年 12 月 22 日更新
看起来 App_Start 没有在启动时被调用。
我在 CreateKernel
和 RegisterServices
中执行了 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/
有人在 monodroid 项目中使用 ninject 吗? 如果是这样,将不胜感激有关实现这一目标的任何指示/细节。 最佳答案 我还没有尝试在 Mono For Android 中使用 Ninjec
我找到了this article关于 Ninject 早期版本中的上下文变量。我的问题有两个方面。首先,如何使用 Ninject 2 获得这种行为?其次,上下文变量是否沿着请求链传递?例如,假设我想替
我有一个场景,只要一个对象上的方法返回 true,多个并发 Web 请求就应该重用一个对象。有问题的对象是线程安全的。 所以我需要当前范围内的对象来确定它是否仍在范围内。使用 Ninject 完成此任
我刚刚使用 Ninject 3 更新了我的应用程序。将 App_Start 中的文件从 NinjectMVC3 更改为 NinijectWebCommon.cs。移动了我的文件,更新了 DLLs..
我在 MVC4 应用程序中使用 Ninject 进行 DI 和 Ninject.MVC3 扩展,特别是版本 3.0.0.6。 阅读documentation在 Ninject 的 wiki 上,使用
如何绑定(bind)InitializerForXXX (非通用实现)到 IInitializer (通用接口(interface))使用 Ninject Conventions以便请求 IIniti
我正在开发一个框架扩展,它使用 Ninject 作为 IoC 容器来处理动态注入(inject),但是我在尝试解决如何实现这一点时遇到了一些麻烦。 我的框架的期望是您将传递 IModule(s)所以它
我确信这是一个愚蠢的问题,因为我假设答案是“当对象被 Ninject 实例化时”......但我想仔细检查...... 为了提供更多关于我为什么问这个问题的背景信息,我有一个实现 NinjectHtt
与其手动绑定(bind)每个类,不如推荐哪些方法和模式(如果有)来自动设置绑定(bind)? 例如,绝大多数绑定(bind)看起来像这样: Bind.To(); 一旦模块变大,您最终可能会得到 100
我试图找到一种将构造函数参数传递给子类的构造函数的方法。 这些对象是不可变的,所以我更喜欢使用构造函数参数。 我遇到的问题是 ConstructorArgument 不继承到子实例化,并且以下语句不可
我正在尝试为事件代理/消息代理的开发找到最新的 Ninject 扩展。 我至少可以找到 3 个:messagebroker , weakeventmessagebroker和 bbveventbrok
我有一个 WebApi 服务,我正在尝试使用 Ninject BindHttpFilter 添加身份验证。 使用 BindHttpFilter 允许我将身份验证过滤器绑定(bind)到特定属性。 Au
Autofac 自动为 Func 生成工厂;我什至可以传递参数。 public class MyClass { public MyClass(Func a, Func b) {
我有一个类需要为其类中的一个方法使用 IRepository。 理想情况下,我希望避免将这种依赖关系解析到类的构造函数中,因此我在 Ninject 中发现了方法级注入(inject),并且想知道这是如
我看到了枚举给定服务(类型)的绑定(bind)列表的方法,但我找不到返回已加载模块中绑定(bind)的所有内容列表的方法。我正在寻找类似Kernel::IEnumerable GetAllRegist
对于初学者,我正在使用这个模块: public class AutoMapperModule : NinjectModule { public override void Load()
我想知道 ninject 是否有可能拦截我类的私有(private)方法。我正在尝试进行一些 aop 编程以动态注入(inject)日志记录机制。 最佳答案 不幸的是,所有要拦截的方法都必须是virt
我是 Ninject 的新手,正在努力让这个测试通过。 (此测试通过 Autofac,但行为在 Ninject 中似乎有所不同)。 [Test] public void RegisterInstanc
我在一个小项目中使用过 Ninject,但现在正在将一个较大的 Web 应用程序转换为 mvc,并且需要有关使用 Ninject 的帮助。在新的解决方案中,我拥有 mvc 站点并将一些功能拆分到单独的
目前,我正在使用 ninject 执行以下绑定(bind)的命令模式: kernel.Bind>().To(); kernel.Bind>().To(); kernel.Bind>().To(); 我
我是一名优秀的程序员,十分优秀!