[英]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.