gpt4 book ai didi

c# - System.Web.Mvc 类型的 Unity ResolutionFailedException

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:42 25 4
gpt4 key购买 nike

我的 WebApp 是 WebForms 页面和 MVC 4 页面的组合。

使用 Unity,我遇到以下异常。

异常类型:

Microsoft.Practices.Unity.ResolutionFailedException, Microsoft.Practices.Unity, Version=2.1.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

留言:

Resolution of the dependency failed, type = "System.Web.Mvc.ModelMetadataProvider", name = "(none)".  Exception occurred while: while resolving.  Exception is: InvalidOperationException - The type ModelMetadataProvider does not have an accessible constructor.  At the time of the exception, the container was:
Resolving System.Web.Mvc.ModelMetadataProvider,(none)

内部异常为:

留言:

The type ModelMetadataProvider does not have an accessible constructor.

堆栈跟踪:

at Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForNullExistingObje ct(IBuilderContext context)  
at BuildUp_System.Web.Mvc.ModelMetadataProvider(IBuilderContext )
at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)
at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)
at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)
at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides)

对于以下类型,我始终得到相同的解析异常:

System.Web.Mvc.ITempDataProvide  
System.Web.Mvc.Async.IAsyncActionInvoker
System.Web.Mvc.IActionInvoker
System.Web.Mvc.ModelMetadataProvider
System.Web.Mvc.IViewPageActivator

在 Application_Start 中,我正在设置 IoC:

DependencyResolver.SetResolver(new UnityDependencyResolver(UnityConfigurator.GetContainer()));

...其中 GetContainer 返回所有已注册的类型,UnityDependencyResolver 是一个 IDependencyResolver

知道是什么导致了这个问题吗?

谢谢,
--埃德

最佳答案

我不确定 UnityConfigurator.GetContainer() 返回的容器实例的行为如何,但我认为它会在需要时尝试自行解析 ModelMetadataProvider。此 ModelMetadataProvider 具有一些您的容器不知道的依赖项,只有初始 MVC 解析器才能解析。 “初始 MVC 解析器”是指调用 DependencyResolver.SetResolver(...) 之前 DependencyResolver.Current 的结果。因此,您需要在自己的容器上实现代理,并将初始 MVC 解析器用作后备。

代理的实现应该是什么样子的快速示例:

public class MvcDependencyResolver:System.Web.Mvc.IDependencyResolver
{
private readonly IDependencyResolver _resolver;

private readonly System.Web.Mvc.IDependencyResolver _fallbackResolver;

public MvcDependencyResolver(IDependencyResolver resolver, System.Web.Mvc.IDependencyResolver fallbackResolver)
{
this._resolver = resolver;
this._fallbackResolver = fallbackResolver;
}

public object GetService(Type serviceType)
{
if ((this._resolver.IsRegistered(serviceType)) || (serviceType.IsClass))
{
try
{
return this._resolver.GetService(serviceType);
}
catch (ResolutionFailedException)
{
}
}
return this._fallbackResolver.GetService(serviceType);
}

然后,在 Application_Start() 中,您使用此代理的实例覆盖 MVC 解析器,如下所示:

var bootstrapper = new Bootstrapper();
var resolver = bootstrapper.Run();
DependencyResolver.SetResolver(new MvcDependencyResolver(resolver, DependencyResolver.Current));

关于c# - System.Web.Mvc 类型的 Unity ResolutionFailedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22332073/

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