ResolutionFailedException with Unity
本文关键字:Unity with ResolutionFailedException | 更新日期: 2023-09-27 18:21:38
我正在使用模式和实践的Unity将依赖项注入到我的对象中,并遇到了一个奇怪的问题(无论如何,对我来说)。以下是我的类定义:
public class ImageManager : IImageManager
{
IImageFileManager fileManager;
public ImageManager(IImageFileManager fileMgr)
{
this.fileManager = fileMgr;
}
}
public class ImageFileManager : IImageFileManager
{
public ImageFileManager(string folder)
{
FileFolder = folder;
}
}
这是注册我的类的代码
container.RegisterInstance<MainWindowViewModel>(new MainWindowViewModel())
.RegisterType<IPieceImageManager, PieceImageManager>(
new InjectionConstructor(typeof(string)))
.RegisterType<IImageFileManager, ImageFileManager>()
.RegisterType<IImageManager, ImageManager>(
new InjectionConstructor(typeof(IImageFileManager)));
我最初在XAML文件的代码后面解决了这个问题(我知道,这违背了目的。请耐心等待。)
IImageManager imageManager = MvvmViewModelLocator.Container.Resolve<IImageManager>(
new ParameterOverride("folder", "/images"));
它奏效了。但我为主视图创建了一个视图模型,当我将同一行复制到其中时,我得到了一个异常。以下是两个最内在的例外:
InnerException: Microsoft.Practices.Unity.ResolutionFailedException
HResult=-2146233088
Message=Resolution of the dependency failed, type = "SwapPuzzleApp.Model.IImageManager", name = "(none)".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The type IImageManager does not have an accessible constructor.
At the time of the exception, the container was:
Resolving SwapPuzzleApp.Model.IImageManager,(none)
Source=Microsoft.Practices.Unity
TypeRequested=IImageManager
StackTrace:
at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides)
at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, String name, IEnumerable`1 resolverOverrides)
at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides)
at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve[T](IUnityContainer container, ResolverOverride[] overrides)
at SwapPuzzleApp.ViewModel.MainWindowViewModel..ctor() in c:'Users'Carole'Documents'Visual Studio 2012'Projects'SwapPuzzle'SwapPuzzle'ViewModel'MainWindowViewModel.cs:line 17
at SwapPuzzleApp.ViewModel.MvvmViewModelLocator..cctor() in c:'Users'Carole'Documents'Visual Studio 2012'Projects'SwapPuzzle'SwapPuzzle'ViewModel'MvvmViewModelLocator.cs:line 51
InnerException: System.InvalidOperationException
HResult=-2146233079
Message=The type IImageManager does not have an accessible constructor.
Source=Microsoft.Practices.Unity
StackTrace:
StackTrace:
at Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForNullExistingObject(IBuilderContext context)
at lambda_method(Closure , IBuilderContext )
at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context)
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)
InnerException:
我不确定问题出在哪里,因为ImageManager显然有一个公共构造函数。我认为这可能是由于路径无效,但如果我具体实例化对象,一切都会正常工作。
// this line has no problems
IImageManager imageManager = new ImageManager(new ImageFileManager("/images"));
我还想知道,当我注册IImageManager时,是否需要传入新的InjectionConstructor(typeof(string)),但这似乎没有帮助,为什么现在需要它而不是以前?所以我被难住了。这是我第一次尝试使用依赖注入,所以它可能是一些基本的东西。不过,我只是没看到什么。
仔细查看错误消息。注意这个部分:
Message=The type IImageManager does not have an accessible constructor.
请注意,类型名称是IImageManager,而不是ImageManager。在这条线上的某个地方,您丢失了类型映射。
FileImageManager的注册也有问题,因为您没有在注册中指定文件夹参数,所以Unity不知道要传递什么字符串。
我使用了本文中的示例作为指导。要么是其中的例子过于超前,无法进行介绍,要么是该主题中存在错误信息。
在咨询了其他来源(主要是PluarlSight)后,我提出了一个更简单、更合乎逻辑的解决方案。
container.RegisterInstance<TimerViewModel>(new TimerViewModel());
container.RegisterType<IPieceImageManager, PieceImageManager>();
container.RegisterType<IImageFileManager, ImageFileManager>
(new InjectionConstructor("/images"));
container.RegisterType<IImageManager, ImageManager>();
我遇到了一个类似的问题,这个错误直接与我为操作所做的Mock(使用automoq)有关。在这种情况下,事实证明,因为有许多成员方法是在对象被嘲笑的情况下被调用的,所以我必须定义automoq链中的所有成员方法,才能使其正确地解析
我意识到这是实例代码中的一个例子,但它也可能出现在Moqs中。因此,如果你读到这篇文章,并且想知道一个与Moqs相关的例子,请先研究一下。