- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 MVC4 Web 应用程序项目,作为更大解决方案的一部分。我也有一个测试项目。我正在处理一堆不会被返工的代码,所以我不能总是做出我想做的更改。
MVC4 Web 应用程序具有“普通” Controller 和 Web API Controller 。我们使用的是 RTM 版本的 Web API,而不是 RC。
我尝试将 IoC 引入到项目中。使用 NuGet 安装技术(而不是下载 DLL 并直接引用它们),我安装了:
Ninject v3.0.1.10,
Ninject.MVC3 v3.0.0.6
Ninject.Extensions.Factory v3.0.1.0
Ninject.Web.Common v 3.0.0.7
我的解决方案中没有使用 Ninject 的其他引用组件。
然后,遵循 Brad Wilson 给出的建议和他的 Github Gist https://gist.github.com/2417226 ,以及 Filip W 给出的类似建议 http://www.strathweb.com/2012/05/using-ninject-with-the-latest-asp-net-web-api-source/ ,我实现了一个 NinjectResolver,并“注册”到全局配置中。
当我启动网络应用程序时,默认页面映射到 Index
对 ProjectController
采取行动。这会渲染一个 View ,该 View 使用 Knockout 通过调用 ApiController
来填充 ViewModel名为 ApiProjectController.Get()
的操作.
我的NinjectWebCommon.cs
代码如下所示:
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Web.Http;
using System.Web.Http.Dependencies;
using Ninject.Extensions.Factory;
using Ninject.Syntax;
using OfficeWebApp.Utilities;
[assembly: WebActivator.PreApplicationStartMethod(typeof(OfficeWebApp.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(OfficeWebApp.App_Start.NinjectWebCommon), "Stop")]
namespace OfficeWebApp.App_Start
{
using System;
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();
/// <summary>
/// Starts the application
/// </summary>
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
Bootstrapper.Initialize(CreateKernel);
}
/// <summary>
/// Stops the application.
/// </summary>
public static void Stop()
{
Bootstrapper.ShutDown();
}
/// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
RegisterServices(kernel);
GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
return kernel;
}
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IDataManagerConnection>().To<DataManagerConnection>().WithConstructorArgument("overriddenConnectionString", string.Empty);
kernel.Bind<IDataManagerConnectionFactory>().ToFactory();
}
}
public class NinjectDependencyScope : IDependencyScope
{
private IResolutionRoot resolver;
internal NinjectDependencyScope(IResolutionRoot resolver)
{
Contract.Assert(resolver != null);
this.resolver = resolver;
}
public void Dispose()
{
IDisposable disposable = resolver as IDisposable;
if (disposable != null)
disposable.Dispose();
resolver = null;
}
public object GetService(Type serviceType)
{
if (resolver == null)
throw new ObjectDisposedException("this", "This scope has already been disposed");
return resolver.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
if (resolver == null)
throw new ObjectDisposedException("this", "This scope has already been disposed");
return resolver.GetAll(serviceType);
}
}
public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver
{
private IKernel kernel;
public NinjectDependencyResolver(IKernel kernel)
: base(kernel)
{
this.kernel = kernel;
}
public IDependencyScope BeginScope()
{
return new NinjectDependencyScope(kernel.BeginBlock());
}
}
}
ProjectController
代码是:
public class ProjectController : Controller
{
private readonly IDataManagerConnectionFactory _dataManagerConnectionFactory;
public ProjectController(IDataManagerConnectionFactory dataManagerConnectionFactory)
{
_dataManagerConnectionFactory = dataManagerConnectionFactory;
}
[HttpGet]
public ActionResult Index()
{
//TODO:
ViewBag.Organisation = "Preview";
return View();
}
}
...以及ApiProjectController
:
public class ApiProjectController : ApiController
{
private readonly IDataManagerConnectionFactory _dataManagerConnectionFactory;
public ProjectsController(IDataManagerConnectionFactory dataManagerConnectionFactory)
{
_dataManagerConnectionFactory = dataManagerConnectionFactory;
}
[HttpGet]
public IEnumerable<ProjectTileModel> Get()
{
using (IDataManagerConnection connection = _dataManagerConnectionFactory.Create())
{
List<ProjectTileModel> projectViewModels = connection.DataManager.GetProjectInfos()
.ToList();
return projectViewModels;
}
}
}
在ApiProjectController.Get()
之后操作方法已完成,Ninject 向我抛出以下异常:
Error loading Ninject component ICache
No such component has been registered in the kernel's component container.
Suggestions:
1) If you have created a custom subclass for KernelBase, ensure that you have properly
implemented the AddComponents() method.
2) Ensure that you have not removed the component from the container via a call to RemoveAll().
3) Ensure you have not accidentally created more than one kernel.
调用堆栈如下所示:
Ninject.dll!Ninject.Components.ComponentContainer.Get(System.Type component) Line 160 C#
Ninject.dll!Ninject.Components.ComponentContainer.Get<Ninject.Activation.Caching.ICache>() Line 116 + 0x46 bytes C#
Ninject.Web.Common.dll!Ninject.Web.Common.OnePerRequestHttpModule.DeactivateInstancesForCurrentHttpRequest.AnonymousMethod__1(Ninject.IKernel kernel) Line 74 + 0x27 bytes C#
Ninject.dll!Ninject.GlobalKernelRegistration.MapKernels(System.Action<Ninject.IKernel> action) Line 75 + 0xe bytes C#
Ninject.Web.Common.dll!Ninject.Web.Common.OnePerRequestHttpModule.DeactivateInstancesForCurrentHttpRequest() Line 76 C#
Ninject.Web.Common.dll!Ninject.Web.Common.OnePerRequestHttpModule.Init.AnonymousMethod__0(object o, System.EventArgs e) Line 56 + 0x9 bytes C#
此异常在 ComponentContainer.cs
中的以下 Ninject 代码中抛出。文件:
Type implementation = _mappings[component].FirstOrDefault(); // <-- see note below...
if (implementation == null)
throw new InvalidOperationException(ExceptionFormatter.NoSuchComponentRegistered(component)); // <-- exception thrown here
注意:在上面指示的行中,_mappings
集合仅包含一项;该 key 与 Type
匹配我们正在寻找 ( ICache
),但是 Values
成员(即 List<Type>
)为空(0 计数)
我应该不使用 OnePerRequestHttpModule
?因为我正在使用.ToFactory()
,所以发生了一些有趣的事情吗?在我的绑定(bind)中?我真的不知道为什么 OnePerRequestHttpModule
正在调用DeactivateInstancesForCurrentHttpRequest()
但 Ninject 似乎想要获取它的内部缓存(也许?)
我做错了什么?
最佳答案
我从来没有真正了解过这件事的真相。我不知道这是 Ninject 中的一个错误,还是我只是错误地使用了它。不过,我通过将 IoC 容器切换到 AutoFAC 解决了我的问题。
关于asp.net-mvc-4 - 为什么在我的 API Controller 完成其请求后会收到 Ninject InvalidOperation 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13931265/
我正在尝试读取财务数据并将其存储。我从中获取财务数据的地方以惊人的精度存储数据,但我只对小数点后的 5 位数字感兴趣。因此,我决定在我创建的 Decimal 上使用 t = .quantize(cde
为什么要转换为 2 位小数的数字? x = 369.69 y=decimal.Decimal(x) Decimal('369.6899999999999977262632455676794052124
使用Python 3.5.2 >>> from decimal import Decimal >>> Decimal('12') % Decimal('0.01') Decimal('0.00') >
Application.Run(form); 实际上我试图从我的项目中调用它。我得到了这个异常(exception)。如何解决?我已经在我的项目中调用了另一个 Application.Run(frmB
我在运行这样的程序时总是会遇到这个错误: from decimal import * getcontext().prec =30 b=("2/3") Decimal(b) 错误: Traceback
我在我的项目中做了以下信号: @receiver(pre_save, sender=group1) @disable_for_loaddata def total_closing_group1(sen
我正在测试我的代码,我认为这段代码是正确的: while True: try: p = Decimal(raw_input(...)) if ...condit
查看 Decimal 我尝试将 pi 转换为各种精度。我可以使用下面的前两个选项调用 pi.quantize() 但它会引发 InvalidOperation 与第三个选项。 pi 的精度远不及...
在处理数据库 decimal 数据类型时,我遇到了 Pandas read_sql_query() 函数的问题。在使用 varchar 或 integer 类型时,我对下面相同的代码没有任何问题。 版
我在尝试运行 sinatra 应用程序时遇到错误。我试着用谷歌搜索它,但什么也没有出现。如果你们可以就如何修复它或我做错了什么提供任何建议,那将是很大的帮助。 部分代码出错 def logTow
我正在使用的系列: import pandas as pd from decimal import Decimal, BasicContext df = pd.Series([14978.22, 16
我打算将交付成本添加到项目总价中,但它不起作用。两个字段都是Decimal但它抛出这个错误 InvalidOperation at /orders/ [] .这是交货价格模型 回溯 File "/
我正在尝试使用 phantomjs 执行生成 PDF 文件的命令. 如果我使用命令提示符执行以下命令,一切正常。 C:\phantomjs-2.1.1\bin\phantomjs.exe C:\pha
我正在使用 Flask 和 pymongo 开发一个项目,我有一个用户集合和一个电影集合,其中实例如下: user = {"Email":"[email protected]" , "Comment
嗨当用户选择菜单项时,我从我的主窗体打开这样的窗体。 private void commToolStripMenuItem_Click(object sender, EventArgs e)
我正在测试 Web 核心 API,但收到 500 内部服务器错误。 我的 Controller 上的方法是; [Route("api/property")] public class Property
我正在尝试将背景 AudioPlayer 添加到 Windows Phone 8 应用程序。 我已经创建了主项目和背景音频代理。我在主项目中添加了对后台音频播放器的引用,并将以下内容添加到应用程序 l
我正在尝试将背景 AudioPlayer 添加到 Windows Phone 8 应用程序。 我已经创建了主项目和背景音频代理。我在主项目中添加了对后台音频播放器的引用,并将以下内容添加到应用程序 l
我在 Django 应用程序中使用 Decimal 对象,发现了这个奇怪的错误: ipdb> decimal.Decimal(10) % 1 Decimal('0') ipdb> decima
我有一个 MVC4 Web 应用程序项目,作为更大解决方案的一部分。我也有一个测试项目。我正在处理一堆不会被返工的代码,所以我不能总是做出我想做的更改。 MVC4 Web 应用程序具有“普通” Con
我是一名优秀的程序员,十分优秀!