2017-05-09 1 views
0

Je travaille dans une application Xamarin avec MVVMCross.IoCResolveException en mode édition

L'application fonctionne parfaitement lorsque je cours en mode débogage.

Mais si essayez d'exécuter en mode de sortie échoue à l'exception:

Exception masked MvxIoCResolveException: Failed to resolve type 
FlexConta.Contracts.Service.IUserService 
[mvx]  at MvvmCross.Platform.IoC.MvxSimpleIoCContainer.Resolve (System.Type t) [0x00035] in <0da3cbd163cf47a29ec04fff5bb9eecd>:0 
[mvx] at MvvmCross.Platform.IoC.MvxSimpleIoCContainer.Resolve[T]() [0x00000] in <0da3cbd163cf47a29ec04fff5bb9eecd>:0 
[mvx] at MvvmCross.Platform.Mvx.Resolve[TService]() [0x00005] in <0da3cbd163cf47a29ec04fff5bb9eecd>:0 
[mvx] at FlexConta.Core.AppStart.Start (System.Object hint) [0x00000] in <880d0bdc2a5448ffb4d7b35d827753b5>:0 
[mvx] at MvvmCross.Droid.Support.V7.AppCompat.MvxSplashScreenAppCompatActivity.TriggerFirstNavigate() [0x00005] in <74631770bbbe4bff8d50c85acb55083c>:0 
[mvx] at MvvmCross.Droid.Support.V7.AppCompat.MvxSplashScreenAppCompatActivity.InitializationComplete() [0x00009] in <74631770bbbe4bff8d50c85acb55083c>:0 
[mvx] at MvvmCross.Droid.Platform.MvxAndroidSetupSingleton.<InitializeFromSplashScreen>b__7_1() [0x0000a] in <099dd6f64bd74189922e6888bc76e146>:0 
[mvx] at MvvmCross.Platform.Core.MvxMainThreadDispatcher.ExceptionMaskedAction (System.Action action) [0x00000] in <0da3cbd163cf47a29ec04fff5bb9eecd>:0 

J'utilise le conteneur du CIO MVVMCross et je suis l'enregistrement de dépendances comme suit:

public override void Initialize() 
    { 
     base.Initialize(); 

     CreatableTypes() 
      .EndingWith("Repository") 
      .AsInterfaces() 
      .RegisterAsLazySingleton(); 

     CreatableTypes() 
      .EndingWith("Service") 
      .AsInterfaces() 
      .RegisterAsLazySingleton(); 

     Mvx.RegisterSingleton<IUserRestAPI>(new UserRestAPI()); 

     RegisterAppStart(new AppStart()); 
    } 

La classe de service Utilisateur:

public class UserService : IUserService 
{ 
    private readonly IUserRepository _userRepository; 
    private readonly IDocumentTypesRepository _documentTypesRepository; 
    private readonly IUserRestAPI _userRestAPI; 

    public UserService(IUserRepository userRepository, IDocumentTypesRepository documentTypesRepository, IUserRestAPI userRestAPI) 
    { 
     _userRepository = userRepository; 
     _documentTypesRepository = documentTypesRepository; 
     _userRestAPI = userRestAPI; 
    } 
    . 
    . 
    . 
} 

Que peut-il se passer?

+0

Si votre Linker paramètre pour définir autre chose que 'None' pour votre version Release, ajoutez un Linker' [Preserve (AllMembers = true)] sur votre classe 'UserService', En fait, tous vos' * Service' et '* Classes du référentiel .... – SushiHangover

Répondre

1

Vous pouvez créer un PreserveAttribute dans votre PCL et l'ajouter aux classes que l'éditeur de liens supprime. Xamarin docs décrire l'utilisation comme

Si vous ne voulez pas prendre une dépendance sur les bibliothèques Xamarin - pour exemple, vous construisez une bibliothèque de classe portable multi-plateforme (PCL) - vous pouvez toujours utiliser Android. Attribut Runtime.Preserve. Pour faire, déclarer une classe PreserveAttribute au sein de l'espace de noms Android.Runtime comme ceci:

namespace Android.Runtime 
{ 
    public sealed class PreserveAttribute : System.Attribute 
    { 
     public bool AllMembers; 
     public bool Conditional; 
    } 
} 

Si vous voulez éviter de lier votre PCL partagé, vous pouvez utiliser link skip pour empêcher l'éditeur de liens de décapage du code de suite de vous PCL.

Dans votre cs android proj juste ajouter <AndroidLinkSkip>YourPCLAssemblyNameHerer</AndroidLinkSkip> ou via les propriétés UI. Options Android -> Lieur -> Ignorer les assemblages de liaison, entrez votre nom d'assembly PCL dans l'entrée.