gpt4 book ai didi

c# - 在 ASP.NET MVC4 中注入(inject)

转载 作者:IT王子 更新时间:2023-10-29 04:38:34 28 4
gpt4 key购买 nike

因此,经过多次折腾后,我终于在我的 MVC4 应用程序中连接并编译了 Ninject。我遇到的问题是 IDependencyScope 接口(interface)不再存在,据我所知,System.Web.Http.Dependencies 命名空间已被取消。

所以,我现在的问题是我已经连接好所有东西,并且在运行应用程序时我得到:

    Sequence contains no elements

[InvalidOperationException: Sequence contains no elements]
System.Linq.Enumerable.Single(IEnumerable`1 source) +379
Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin.Start() in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectMvcHttpApplicationPlugin.cs:53
Ninject.Web.Common.Bootstrapper.<Initialize>b__0(INinjectHttpApplicationPlugin c) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:52
Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.cs:31
Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:53
Ninject.Web.Common.NinjectHttpApplication.Application_Start() in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\NinjectHttpApplication.cs:81

我无法追踪甚至开始弄清楚它的来源。

我在 Global.asax.cs 中的标准 Ninject 方法如下所示:

        protected override IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
kernel.Bind<IRenderHelper>().To<RenderHelper>();

GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(kernel));
return kernel;
}

protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
BundleTable.Bundles.RegisterTemplateBundles();
}

还有我的自定义解析器:

public class NinjectDependencyResolver : IDependencyResolver
{
private readonly IKernel _kernel;

public NinjectDependencyResolver(IKernel kernel)
{
_kernel = kernel;
}

public object GetService(Type serviceType)
{
return _kernel.TryGet(serviceType);
}

public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return _kernel.GetAll(serviceType);
}
catch (Exception)
{
return new List<object>();
}
}

public void Dispose()
{
// When BeginScope returns 'this', the Dispose method must be a no-op.
}
}

如有任何见解,我们将不胜感激。我已经花了太多时间尝试将任何 DI 框架连接到在 .NET 4.5 上运行的最新 MVC4 RC,现在刚刚达到我对根本无法正常工作的容忍水平。

编辑 #1在 github 中进一步研究 ExtensionsForIEnumerableOfT.cs 并没有多大帮助:

https://github.com/ninject/ninject/blob/master/src/Ninject/Infrastructure/Language/ExtensionsForIEnumerableOfT.cs

如果我自己写的话,我可能会开始理解这一点,但 Bootstrapper.cs 也没有太大帮助。

https://github.com/ninject/Ninject.Web.Common/blob/master/src/Ninject.Web.Common/Bootstrapper.cs

希望这些详细信息可以让任何可能对 Ninject 有更多经验的人更容易上手。

编辑#2遇到的错误具体在NinjectMvcHttpApplicationPlugin.cs:

违规行是:

ModelValidatorProviders.Providers.Remove(ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().Single());

它存在于以下方法中:

public void Start()
{
ModelValidatorProviders.Providers.Remove(ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().Single());
DependencyResolver.SetResolver(this.CreateDependencyResolver());
RemoveDefaultAttributeFilterProvider();
}

ModelValidatorProviders 集合包含 2 个元素:{System.Web.Mvc.DataErrorInfoModelValidatorProvider}{System.Web.Mvc.ClientDataTypeModelValidatorProvider}

它试图删除一个实例:

System.Web.Mvc.DataAnnotationsModelValidatorProvider

这显然没有加载到 ModelValidationProviders.Providers 集合中。从这里有什么想法吗?

解决上述异常并进入下一个

要解决 ModelValidatorProviders 中的问题,我必须手动添加它期望的对象。所以现在我的 CreateKernel 方法看起来像:

protected override IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());

kernel.Bind<IRenderHelper>().To<RenderHelper>();
kernel.Unbind<IDocumentViewerAdapter>();

GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(kernel));
ModelValidatorProviders.Providers.Add(new DataAnnotationsModelValidatorProvider());
FilterProviders.Providers.Add(new FilterAttributeFilterProvider());
return kernel;
}

现在它运行并进入了 Ninject 的实际内部,但仍然有一个问题,一个再次没有意义的问题:

Exception Details: Ninject.ActivationException: Error activating IntPtr
No matching bindings are available, and the type is not self-bindable.
Activation path:
3) Injection of dependency IntPtr into parameter method of constructor of type Func{IKernel}
2) Injection of dependency Func{IKernel} into parameter lazyKernel of constructor of type HttpApplicationInitializationHttpModule
1) Request for IHttpModule

Suggestions:
1) Ensure that you have defined a binding for IntPtr.
2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
3) Ensure you have not accidentally created more than one kernel.
4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
5) If you are using automatic module loading, ensure the search path and filters are correct.

最佳答案

好吧,在用头撞墙太久之后,我明白了是怎么回事。在 .NET 4.5 上运行的 MVC4 的默认项目类型引用了 System.Web.Http 的原始 RC 版本,而不是更新版本。

命名空间缺失,对象不存在,生活并不美好。

解决步骤:

  1. 在 MVC4 项目中删除对 System.Web.Http 的引用
  2. 添加引用 -> System.Web.Http
  3. 删除您为使 System.Web.Http 的旧垃圾版本工作而投入的所有工作
  4. 在 Ninject 中重新应用标准流程进行布线。

    但是,错误是:

    异常详细信息:Ninject.ActivationException:激活 IntPtr 时出错没有可用的匹配绑定(bind),并且该类型不可自绑定(bind)。激活路径: 3)在Func{IKernel}类型构造函数的参数方法中注入(inject)依赖IntPtr 2) 将依赖 Func{IKernel} 注入(inject)到 HttpApplicationInitializationHttpModule 类型的构造函数的参数 lazyKernel 中 1) 请求 IHttpModule

    建议: 1) 确保您已经为 IntPtr 定义了一个绑定(bind)。 2) 如果绑定(bind)是在模块中定义的,确保模块已经加载到内核中。 3) 确保您没有意外创建多个内核。 4) 如果您使用构造函数参数,请确保参数名称与构造函数参数名称相匹配。 5) 如果您使用自动模块加载,请确保搜索路径和过滤器正确。

更新这是通过将 MVC 从 MVC4 Beta 更新到 MVC4 RC 解决的。

关于c# - 在 ASP.NET MVC4 中注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11470243/

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