ResolutionFailedException avec l'Unité
Je suis en utilisant des Modèles et des Pratiques de l' " Unité d'injecter des dépendances dans mes objets et ont frappé un bizarre (pour moi, de toute façon) question. Voici mon définitions de classe:
public class ImageManager : IImageManager
{
IImageFileManager fileManager;
public ImageManager(IImageFileManager fileMgr)
{
this.fileManager = fileMgr;
}
}
public class ImageFileManager : IImageFileManager
{
public ImageFileManager(string folder)
{
FileFolder = folder;
}
}
Et voici le code pour enregistrer mes cours
container.RegisterInstance<MainWindowViewModel>(new MainWindowViewModel())
.RegisterType<IPieceImageManager, PieceImageManager>(
new InjectionConstructor(typeof(string)))
.RegisterType<IImageFileManager, ImageFileManager>()
.RegisterType<IImageManager, ImageManager>(
new InjectionConstructor(typeof(IImageFileManager)));
L'origine, j'avais résolu ce problème dans le code-behind (je sais, il défait le but. Ours avec moi.) de le fichier XAML comme ce
IImageManager imageManager = MvvmViewModelLocator.Container.Resolve<IImageManager>(
new ParameterOverride("folder", "/images"));
Et cela a fonctionné. Mais j'ai créé un modèle d'affichage de mon écran principal et lorsque j'ai copié la même ligne, je reçois une exception. Voici les deux plus à l'intérieur des exceptions:
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:
Je ne suis pas sûr de ce que le problème est, comme ImageManager a clairement un constructeur public. J'ai pensé que cela pourrait être dû à un chemin d'accès non valide, mais si j'concrètement instancier l'objet, tout fonctionne.
//this line has no problems
IImageManager imageManager = new ImageManager(new ImageFileManager("/images"));
Je me suis aussi demandé si j'avais besoin de passer à nouveau InjectionConstructor(typeof(string)) quand je m'inscris IImageManager, mais il ne semble pas aider, et pourquoi serait-il nécessaire maintenant et pas avant? Donc je suis perplexe. C'est ma première tentative à l'aide d'Injection de Dépendance, donc c'est probablement quelque chose de fondamental. Je suis tout simplement pas voir que, bien que.
- Vous êtes en train de résoudre IImageManager et en passant en paramètre au constructeur appelé "dossier" de type string. Mais ImageManager n'a pas un constructeur qui correspond à cette définition; ImageManager du constructeur accepte IImageFileManager.
- Hm. Qui n'a l'air un peu bizarre, mais ça marchait quand je l'ai mis dans MainWindow.xaml.cs, donc j'ai supposé que la ligne est correcte. Des conjectures sur la raison qui pourrait fonctionner dans un fichier et pas un autre?
- J'ai quitté ce seul pendant plusieurs mois et finalement retournée. Je vois maintenant que j'ai été faire les choses très, très mal.
Vous devez vous connecter pour publier un commentaire.
J'ai été en utilisant les exemples de cet article que mon guide. Soit les exemples qu'il y a trop avancé pour une introduction, ou il y a de la désinformation à ce sujet.
Après consultation d'autres sources (principalement PluarlSight), je suis venu avec un moyen beaucoup plus simple et plus logique de la solution.
Examiner de très près le message d'erreur. Remarquez que cette partie:
Avis le nom du type est IImageManager, pas ImageManager. Quelque part le long de la ligne que vous avez perdu votre type de cartographie.
Votre inscription FileImageManager a un problème, puisque vous ne spécifiez pas le paramètre de dossier à l'inscription, de sorte que l'Unité n'a aucune idée de quelle chaîne passe.