Parcours
/
C#
C#
/
Exercices
/
L'ORM d'un seul coup
L'ORM d'un seul coup

L'ORM d'un seul coup

Exercice d'apprentissage

Introduction

Durée de vie des ressources

resource-cleanup utilise l'interface IDispose pour signaler que la ressource d'un objet, ou un autre état du programme, devait être libérée ou réinitialisée lorsque l'objet n'était plus nécessaire (et que compter sur le ramasse-miettes n'y parviendrait pas ou n'offrirait pas le niveau de contrôle requis), et que la méthode IDisposable.Dispose() était l'endroit naturel pour de telles opérations de nettoyage.

Il existe une autre construction, le bloc using, qui permet, du point de vue de l'appelant, de rassembler toute la gestion de la durée de vie des ressources dans une seule instruction.

using (var file = new File("my_secrets"))
{
    file.WriteSecret("xxxxxxx");
}

Dans l'exemple ci-dessus, les ressources du système de fichiers associées à file seront libérées et rendues au système d'exploitation à la sortie du bloc using.

Pour que ce mécanisme fonctionne, la variable de l'instruction using doit être un type référence qui implémente l'interface IDisposable et doit libérer des ressources ou réinitialiser l'état du programme dans sa méthode Dispose().

C# 8 introduit un raffinement de ce mécanisme. Une instruction using peut être placée au début d'un bloc.

using var drawingResource = some_provided_or_new_object;
try
{
    drawingResource.DrawSomething();
}
catch (Exception)
{
    throw;
}

Les développeurs Java y reconnaîtront un équivalent du mécanisme de gestion automatique des ressources introduit dans Java 7.

Instructions

Te revoilà au travail sur le système ORM (Object Relationship Mapping, la correspondance objet-relationnel) introduit dans object-relational-mapping.

Notre analyse de l'utilisation de l'ORM montre que 95 % des transactions sont exécutées depuis une seule méthode appelante, et il a été décidé qu'il serait plus pertinent de disposer d'une unique méthode ORM qui ouvre, écrit et valide une transaction.

La base de données expose les méthodes d'instance suivantes :

  • Database.BeginTransaction() démarre une transaction sur la base de données.
  • Database.Write(string data) écrit des données dans la base de données au sein de la transaction. Si elle reçoit des données invalides, une exception sera levée. Une tentative d'appeler cette méthode sans avoir appelé BeginTransaction() provoquera la levée d'une exception. En cas de succès, l'état interne de la base de données passe à DataWritten.
  • Database.EndTransaction() valide la transaction auprès de la base de données. Elle peut lever une exception si elle ne parvient pas à clôturer la transaction ou si Database.BeginTransaction() n'a pas été appelée.
  • Un appel à Database.Dispose() nettoie la base de données si une exception est levée pendant une transaction. Cela fait passer l'état de la base de données à Closed.

1. Écrire dans la base de données

Implémente la méthode Orm.Write() pour démarrer une transaction sur la base de données, écrire les données passées en argument et valider la transaction. Toutes les exceptions, y compris InvalidOperationException, doivent pouvoir remonter à l'appelant sans être journalisées ni faire l'objet de la moindre intervention.

Database db = new Database();
Orm orm = new Orm(db);
orm.Write("good write");
// => database has an internal state of State.Closed
orm.Write("bad write");
// => an exception is thrown but database is left with an internal state of State.Closed
orm.Write("bad commit");
// => an exception is thrown but database is left with an internal state of State.Closed

2. Écrire dans la base de données et renvoyer à l'appelant une indication du succès de l'écriture

Plusieurs mois se sont écoulés depuis l'introduction de Orm.Write() et l'équipe est divisée. Beaucoup de développeurs aimeraient que l'ORM gère les erreurs lorsque des exceptions sont levées et renvoie simplement à l'appelant une indication de succès.

Implémente la méthode Orm.WriteSafely() pour démarrer une transaction sur la base de données, écrire les données passées en argument et valider la transaction (comme ci-dessus). Elle doit renvoyer true si l'écriture a réussi, sinon false. N'essaie pas de journaliser l'exception.

Database db = new Database();
Orm orm = new Orm(db);
orm.WriteSafely("good write");
// => true
orm.WriteSafely("bad write");
// => false
orm.WriteSafely("bad commit");
// => false
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
C# Exercism

Prêt à commencer L'ORM d'un seul coup ?

Inscris-toi sur Exercism pour apprendre et maîtriser C# avec 62 concepts178 exercices, et un vrai mentorat humain, le tout gratuitement.