簡體   English   中英

System.Web.Mvc 類型的Unity ResolutionFailedException

[英]Unity ResolutionFailedException for System.Web.Mvc Types

我的 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)

Inner Exception

留言

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 這個ModelMetadataProvider有一些你的容器不知道的依賴項,只有初始 MVC 解析器可以解析。 通過“初始MVC解析器”我的意思的結果DependencyResolver.Current打電話之前DependencyResolver.SetResolver(...) 因此,您需要在自己的容器上實現代理,並將初始 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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM