首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一ResolutionFailedException用于System.Web.Mvc类型

统一ResolutionFailedException用于System.Web.Mvc类型
EN

Stack Overflow用户
提问于 2014-03-11 17:23:39
回答 1查看 2.2K关注 0票数 2

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

使用联合,我将得到以下异常。

异常类型

代码语言:javascript
复制
Microsoft.Practices.Unity.ResolutionFailedException, Microsoft.Practices.Unity, Version=2.1.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

消息

代码语言:javascript
复制
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)

Inner Exception为:

消息

代码语言:javascript
复制
The type ModelMetadataProvider does not have an accessible constructor.

堆栈跟踪

代码语言:javascript
复制
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)  

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

代码语言:javascript
复制
System.Web.Mvc.ITempDataProvide  
System.Web.Mvc.Async.IAsyncActionInvoker  
System.Web.Mvc.IActionInvoker  
System.Web.Mvc.ModelMetadataProvider  
System.Web.Mvc.IViewPageActivator

在Application_Start中,我使用以下方法设置IoC:

代码语言:javascript
复制
DependencyResolver.SetResolver(new UnityDependencyResolver(UnityConfigurator.GetContainer()));

...where GetContainer返回所有已注册类型,UnityDependencyResolver is-a IDependencyResolver

有什么原因造成这个问题吗?

谢谢,

--教育

EN

回答 1

Stack Overflow用户

发布于 2015-01-02 20:03:49

我不确定UnityConfigurator.GetContainer()返回的容器实例的行为如何,但我假设它在需要时试图单独解决ModelMetadataProvider问题。这个ModelMetadataProvider有一些依赖项,您的容器不知道只有初始的MVC解析器才能解决。所谓“初始MVC解析器”,我指的是调用DependencyResolver.Current之前的DependencyResolver.SetResolver(...)结果。因此,您需要在自己的容器上实现一个代理,并使用初始的MVC解析器作为后盾。

代理的实现应该是这样的一个快速示例:

代码语言:javascript
复制
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解析器,如下所示:

代码语言:javascript
复制
var bootstrapper = new Bootstrapper();
var resolver = bootstrapper.Run();
DependencyResolver.SetResolver(new MvcDependencyResolver(resolver, DependencyResolver.Current));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22332073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档