C# ASP.NET Google Calendar : MyCalendarService.cs

Avantages du Pattern Singleton dans MyCalendarService.cs

Le pattern Singleton assure une gestion efficace et centralisée du service Google Calendar, améliorant ainsi la performance et la maintenance de l’application.

Utiliser le pattern Singleton dans MyCalendarService.cs présente plusieurs avantages :

  1. Une seule instance : Garantit qu’une seule instance de MyCalendarService est créée, évitant les conflits et les incohérences.
  2. Accès centralisé : Facilite l’accès à l’API Google Calendar depuis n’importe quelle partie de l’application via une instance unique.
  3. Initialisation paresseuse : L’instance est créée seulement lorsqu’elle est nécessaire, ce qui améliore les performances.
  4. Contrôle des ressources : Gère les accès aux ressources partagées de manière cohérente et sécurisée.
  5. Réduction de l’overhead : Évite la surcharge de création répétée d’instances, économisant des ressources et du temps.
  6. Gestion de l’état simplifiée : Facilite la gestion de l’état et des données partagées, rendant le code plus simple et plus propre.

Code C# commenter du fichier MyCalendarService.cs

using Google.Apis.Auth.OAuth2;
using Google.Apis.Calendar.v3;
using Google.Apis.Calendar.v3.Data;
using Google.Apis.Services;
using Google.Apis.Util.Store;

namespace MyCalendarToDoToday.Services
    {/// <summary>
     /// Service pour interagir avec Google Calendar, 
     /// permettant la récupération et la création d'événements.
     /// </summary>
    public class MyCalendarService
    {
        /// <summary>
        /// Instance unique de MyCalendarService (singleton).
        /// </summary>
        private static MyCalendarService? instance;

        /// <summary>
        /// Instance du service Google Calendar.
        /// </summary>
        private CalendarService service;

        /// <summary>
        /// Modifier cette valeur selon l'environnement
        /// </summary>
        private static bool isDevMode = true;

        /// <summary>
        /// Constructeur privé pour empêcher l'instanciation directe.
        /// Initialise le service Google Calendar.
        /// </summary>
        private MyCalendarService()
        {
            service = GetCalendarService();
        }

        /// <summary>
        /// Obtient l'instance unique de MyCalendarService.
        /// </summary>
        /// <returns>L'instance de MyCalendarService.</returns>
        public static MyCalendarService GetInstance()
        {
            if (instance == null)
            {
                instance = new MyCalendarService();
            }
            return instance;
        }

        /// <summary>
        /// Initialise et retourne le service Google Calendar.
        /// </summary>
        /// <returns>L'instance de CalendarService.</returns>
        private CalendarService GetCalendarService()
        {
            // Chemin d'accès au fichier contenant les informations d'identification.
            string credPath = isDevMode ? "../client_secret.json" : "client_secret.json";

            // Initialisez l'objet UserCredential en utilisant le fichier de clés JSON.
            UserCredential credential;
            using (var stream = new FileStream(credPath, FileMode.Open, FileAccess.Read))
            {
                credPath = "token.json";
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.FromStream(stream).Secrets,
                    new[] { CalendarService.Scope.Calendar },
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
            }
            // Initialisez le service Calendar API avec les informations d'identification.
            var service = new CalendarService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "myProjectCalendar'ToDoToday'"
            });
            MessageBox.Show("Connecté à Google Calendar");

            return service;
        }

        /// <summary>
        /// Récupère la liste des événements pour un jour donné.
        /// </summary>
        /// <param name="date">La date pour laquelle récupérer les événements.</param>
        /// <returns>Liste des événements du jour.</returns>
        public List<Event> FetchEventListByADay(DateTime date)
        {
            // Utiliser l'instance pour récupérer le service
            var service = GetInstance().service;

            // Définir la plage de temps pour laquelle récupérer les événements
            var startOfDay = date;
            var endOfDay = startOfDay.AddDays(1);

            // Définir les paramètres de requête pour la liste des événements
            var request = service.Events.List("primary");
            request.TimeMin = startOfDay;
            request.TimeMax = endOfDay;
            request.ShowDeleted = false;
            request.SingleEvents = true;
            request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;

            try
            {
                var events = request.Execute().Items;

                // Utilisation de l'expression ternaire pour retourner un tableau vide si events est null
                return events == null ? new List<Event>() : events.ToList();
            }
            catch (Exception ex)
            {
                // Note : Si exeption : 'Error:' "invalid_grant" :: Aller sur Google cloud pour réactiver "Identity-Aware Proxy"
                MessageBox.Show("\"Identity-Aware Proxy\" désactivée veuillez le réactiver sur le service Google Cloud de votre projet.", $"Erreur de communication avec L'API: {ex.Message}", MessageBoxButtons.OK, MessageBoxIcon.Error);

                // En cas d'erreur, retourner un tableau vide
                return new List<Event>();
            }
        }

        /// <summary>
        /// Crée un événement d'une journée complète dans Google Calendar.
        /// </summary>
        /// <param name="date">La date de l'événement.</param>
        /// <param name="eventTitle">Le titre de l'événement.</param>
        /// <param name="location">Le lieu de l'événement.</param>
        /// <param name="description">La description de l'événement.</param>
        public void CreateFullDayEvent(DateTime date, string eventTitle, string location, string description)
        {
            // Utiliser l'instance pour récupérer le service
            var service = GetInstance().service;

            // Créer un nouvel événement
            Event newEvent = new Event()
            {
                Summary = eventTitle,
                Location = location,
                Description = description,
                Start = new EventDateTime()
                {
                    Date = date.Date.ToString("yyyy-MM-dd"),
                    TimeZone = "Europe/Paris"
                },
                End = new EventDateTime()
                {
                    Date = date.Date.ToString("yyyy-MM-dd"),
                    TimeZone = "Europe/Paris"
                }
            };
            try
            {
                // Ajouter l'événement à l'agenda
                EventsResource.InsertRequest request = service.Events.Insert(newEvent, "primary");
                Event createdEvent = request.Execute();

                // Message de succés 
                // MessageBox.Show("L'évènement a été ajouté"); // Décommenter pour afficher un message de succès
            }
            catch (Exception ex)
            {
                MessageBox.Show("Une erreur c'est produite lors de la création de l'événement: " + ex.Message );
            }
        }

        /// <summary>
        /// Crée un événement avec une heure de début et de fin spécifique dans Google Calendar.
        /// </summary>
        /// <param name="startDate">La date et l'heure de début de l'événement.</param>
        /// <param name="endDate">La date et l'heure de fin de l'événement.</param>
        /// <param name="eventTitle">Le titre de l'événement.</param>
        /// <param name="location">Le lieu de l'événement.</param>
        /// <param name="description">La description de l'événement.</param>
        public void CreateDateTimeEvent(DateTime startDate, DateTime endDate, string eventTitle, string location, string description)
        {
            // Utiliser l'instance pour récupérer le service
            var service = GetInstance().service;

            // Créer un nouvel événement
            var newEvent = new Event()
            {
                Summary = eventTitle,
                Location = location,
                Description = description,
                Start = new EventDateTime()
                {
                    DateTime = startDate,
                    TimeZone = "Europe/Paris"
                },
                End = new EventDateTime()
                {
                    DateTime = endDate,
                    TimeZone = "Europe/Paris"
                }
            };
            try
            {
                // Ajouter l'événement à l'agenda
                EventsResource.InsertRequest request = service.Events.Insert(newEvent, "primary");
                Event createdEvent = request.Execute();

                // Message de succés 
                //MessageBox.Show("L'évènement a été ajouté"); // Décommenter pour afficher un message de succès
            }
            catch (Exception ex)
            {
                MessageBox.Show("Une erreur c'est produite lors de la création de l'événement: " + ex.Message);
            }
        }

    }
}
Scroll to Top