2014-04-30 1 views
0

Je ne parviens pas à instancier le viewmodel lorsque les dépendances viewmodel se propagent dans différents projets.Problème de création de MvvmCross Viewmodel

Le constructeur ViewModel est la suivante:

public MyViewModel(IMyBusinessLogic businessLogic) 
{ 
    ... 
} 


public class App : Cirrious.MvvmCross.ViewModels.MvxApplication 
{ 
    public override void Initialize() 
    { 
     CreatableTypes(). 
      EndingWith("BusinessLogic"). 
      AsInterfaces(). 
      RegisterAsLazySingleton(); 
     RegisterAppStart<MyViewModel>(); 
    } 
} 

IMyBusinessLogic est en projet différent de la même solution. L'implémentation réelle de cette interface est dans un projet différent.

J'ai ajouté un projet d'interface de logique métier comme référence dans le projet viewmodel.

Quelqu'un peut-il aider à résoudre ce problème?

Le journal d'erreur:

MVX: Diagnostic: 0,12 Affichage ViewModel MyViewModel 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): Chargé « C: \ Data \ Programmes {9E891FD9-C43E-4ED3 -9EDC-153E29371D89} \ Install \ BusinessLogic.Interface.DLL '. Symboles chargés. MVX: Avertissement: 0.38 Problème création viewmodel de type MyViewModel - problème MvxIoCResolveException: Impossible de résoudre le paramètre pour le paramètre myBusinessLogic de type IMyBusinessLogic lorsque création ViewModel.Core.MyViewModel à Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.GetIoCParameterValues ​​(Type Type , ConstructorInfo firstConstructor) à Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.IoCConstruct (type Type)
à Cirrious.CrossCore.Mvx.IocConstruct (type t) à Cirrious.MvvmCross.ViewModels.MvxDefaultViewModelLocator.TryLoad (Type viewModelType , IMvxBundle parameterValues, IMvxBundle savedState, IMvxViewModel & viewModel) 'TaskHost.exe' (CoreCLR: Silverlight AppDomain): chargé 'C: \ windows \ system32 \ fr-FR \ mscorlib.debug.resources.dll'. Le module était construit sans symboles.

@ Stuart: Comme il a été mentionné dans le wiki, je l'ai remplacer la méthode GetViewModelAssemblies() dans le Setup.cs qui existent dans le projet de l'interface spécifique de plate-forme.

protected override Assembly[] GetViewModelAssemblies() 
     { 
      var list = new List<Assembly>(); 
      list.AddRange(base.GetViewModelAssemblies()); 
      list.Add(typeof(BusinessLogic.Core.MyBusinessLogic).Assembly); 
      list.Add(typeof(BusinessLogic.Interface.IMyBusinessLogic).Assembly); 

      return list.ToArray(); 
     } 

Mais maintenant ce que j'ai observé est la séquence d'appel est le premier App.Initialize() puis Setup.GetViewModelAssemblies(). Donc encore une fois je vois le même problème que ce n'est pas en mesure de trouver le type requis de IoC pour craquer le viewmodel. Une suggestion à ce sujet?

+0

Je l'ai fait une analyse plus approfondie. Actuellement ce que j'ai observé est que, la méthode MvxApplication: CreatableTypes() recherche seulement la DLL actuelle, et pas l'autre Dll qui a été chargée. Et puisque mon interface et l'implémentation réelle de l'interface se trouvent dans des DLL différentes, cela ne permet pas de rechercher dans ces dll, et donc les classes de logique métier ne sont pas enregistrées. ** Y a-t-il un moyen de rendre la méthode MvxApplication: CreatableTypes() à rechercher dans toutes les DLLs chargées? ** – tsr

+0

Je suis sur mobile pour le moment ... Mais c'est dans le wiki quelque part - cherchez le modèle de vue assemblages dans la configuration – Stuart

+0

@Stuart: essayé de remplacer GetViewModelAssemblies (comme indiqué dans la question ci-dessus). Toujours avoir le même problème. Quelque chose que je manque ici? – tsr

Répondre

0

Pour regardant ViewModels dans plusieurs assemblées, vous pouvez utiliser https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup#providing-additional-view-and-viewmodel-assemblies

protected override Assembly[] GetViewModelAssemblies() 
{ 
    var list = new List<Assembly>(); 
    list.AddRange(base.GetViewModelAssemblies()); 
    list.Add(typeof(SomeTypeFromAdditionalViewModelAssembly1).Assembly); 
    list.Add(typeof(SomeTypeFromAdditionalViewModelAssembly2).Assembly); 
    list.Add(typeof(SomeTypeFromAdditionalViewModelAssembly3).Assembly); 
    // ... 
    return list.ToArray(); 
} 

Pour IoC l'enregistrement des services de différents ensembles, il y a une méthode d'extension Assembly disponible - voir https://github.com/MvvmCross/MvvmCross/wiki/Service-Location-and-Inversion-of-Control#bulk-registration-by-convention

Si vous cherchez à comprendre comment fonctionne l'IoC dans MvvmCross, puis https://github.com/MvvmCross/MvvmCross/wiki/Service-Location-and-Inversion-of-Control est un bon point de départ < - lecture recommandée.

vous pouvez vous pouvez aussi, bien sûr, utiliser le même type de logique d'enregistrement sur les ensembles autres que de base - .: par exemple

typeof(Reusable.Helpers.MyHelper).Assembly.CreatableTypes() 
     .EndingWith("Helper") 
     .AsInterfaces() 
     .RegisterAsDynamic(); 
Questions connexes