Utilisation de DependencyService pour gérer le mode connecté ou non connecté

Ajouté par Alexandre Journaux il y a environ 3 ans

L'idée c'est d'utiliser le service d'injection de DependencyService pour appeler le bon DAO en fonction de l'état de la connexion.

Prenons un exemple : Récupérer les animaux d'un élevage.
- Si la connexion fonctionne, la récupération des animaux pourra se faire grâce à l'appel du webservice adéquat
- Si la connexion est inactive, la récupération des animaux pourra se faire à partir d'un fichier xml stocké sur l'appareil

Avant de commencer, il faut, au préalable, donner l'autorisation d'accéder à l'état de connexion de l'appareil. Pour cela, dans le fichier AssemblyInfo.cs du projet Android, ajouter la ligne ci-dessous :

[assembly: UsesPermission(Android.Manifest.Permission.AccessNetworkState)]

Ensuite, on va créer une interface IAnimalDAO

public interface IAnimalDAO
{
    List<Animal> getAnimalByElevage(Elevage elevage);
}

Puis, on va créer 2 classes :
- WSAnimalDAO qui va récupérer les animaux en appelant le ws correspondant
- XMLAnimalDAO qui va récupérer les animaux en lisant le fichier xml correspondant

Je ne détaille pas ici le code de ces 2 classes. C'est du C# classique. Il faut juste penser à implémenter l'interface dans ces 2 classes.

public class BDAnimalDAO : IAnimalDAO
public class XmlAnimalDAO : IAnimalDAO

Pour déterminer quelle classe doit être appelée en fonction de l'état de connexion, on va créer une classe statique ConnexionHelper

public static class ConnexionHelper
{
    public static void InitialiseConnexion()
    {
        /*La classe Connectivity vient de Xamarin.Essentials*/
        var current = Connectivity.NetworkAccess;
        /*NetworkAccess vient de Xamarin.Essentials*/
        if (current == NetworkAccess.Internet)
        {
            /* La connexion internet est disponible : on instancie BDAnimalDAO */
            DependencyService.Register<IAnimalDAO, BDAnimalDAO>();
        }
        else
        {
            /* La connexion internet n'est pas disponible : on instancie XmlAnimalDAO */
            DependencyService.Register<IAnimalDAO, XmlAnimalDAO>();
        }
    }
}

Il ne reste plus qu'à appeler cette méthode à l’endroit où vous souhaitez tester la connexion :

ConnexionHelper.InitialiseConnexion();

et pour finir, récupérer le bon DAO en utilisant DependencyService

IAnimalDAO iaDAO = DependencyService.Get<IAnimalDAO>();
List <Animal> animauxDeLelevage = iaDAO.getAnimalByElevage(ElevageSelectionne);