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.
InformationsquelleAutor VanillaBean | 2013-07-08