Parcours
/
C#
C#
/
Exercices
/
Mapping objet-relationnel
Mapping objet-relationnel

Mapping objet-relationnel

Exercice d'apprentissage

Introduction

Nettoyage des ressources

Si une classe implémente l'interface IDisposable, alors sa méthode Dispose() doit être appelée dès qu'une instance n'est plus nécessaire. Cela se fait généralement depuis une clause catch ou finally, ou depuis la routine Dispose() d'un appelant. Dispose() permet de libérer des ressources non managées, comme les objets du système d'exploitation (qui ne sont pas gérés par le runtime .NET), et de réinitialiser l'état interne des ressources managées.

Instructions

Tu implémentes un système ORM (Object Relational Mapping, ou mappage objet-relationnel) au-dessus d'une base de données fournie par une autre équipe.

La base de données ne peut gérer qu'une seule transaction à la fois.

Aucune journalisation ni autre gestion d'erreur n'est nécessaire à ce stade.

Note qu'en interne, la base de données passe par plusieurs états : Closed, TransactionStarted, DataWritten, Invalid, Closed. Tu peux partir du principe que la base de données est dans un état Closed au début de chaque exercice.

La base de données dispose des méthodes d'instance suivantes :

  • Database.BeginTransaction() démarre une transaction sur la base de données. Si on l'appelle alors que la base de données n'est pas dans un état Closed, une exception est levée. En cas de succès, l'état interne de la base de données passe à TransactionStarted.
  • 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 est levée. Une tentative d'appel à cette méthode sans avoir appelé BeginTransaction() provoquera une exception. En cas de succès, l'état interne de la base de données passe à DataWritten.
  • Database.EndTransaction() valide la transaction dans la base de données. Elle peut lever une exception si elle n'arrive 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.

On peut accéder à l'état de la base de données à l'aide de database.DbState.

L'état de la base de données peut prendre l'une des valeurs suivantes :

  • TransactionStarted
  • DataWritten
  • Invalid
  • Closed

1. Démarre une transaction

Implémente Orm.Begin() pour démarrer une transaction sur la base de données. Si la base de données ne démarre pas avec un état interne de State.Closed, alors elle lève une InvalidOperationException.

var orm = new Orm(new Database());
orm.Begin();
// => database has an internal state of State.TransactionStarted

2. Écris des données dans la base de données

Implémente Orm.Write() pour écrire des données dans la base de données. Si la base de données ne démarre pas avec un état interne de State.TransactionStarted, ou si des données invalides sont écrites, une InvalidOperationException est levée. Si l'écriture échoue, l'Orm doit nettoyer la base de données.

var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
// => database has an internal state of State.DataWritten
orm.Write("bad write");
// => database has an internal state of State.Closed

3. Valide les données précédemment écrites dans la base de données

Implémente Orm.Commit() pour valider les données. Si la validation échoue, nettoie la base de données. Si la base de données ne démarre pas avec un état interne de State.DataWritten, une InvalidOperationException est levée.

var orm = new Orm(new Database());
orm.Begin();
orm.Write("some data");
orm.Commit();
// => database has an internal state of State.Closed
orm.Begin();
orm.Write("bad commit");
orm.Commit();
// => database has an internal state of State.Closed

4. Assure-toi que la base de données est correctement nettoyée si l'ORM doit se fermer en cours de transaction

Implémente l'interface IDisposable sur la classe Orm. Cet appel est garanti de réussir.

var db = new Database();
var orm = new Orm(db);
orm.Begin();
orm.Write("some data");
orm.Dispose();
// => database has an internal state of State.Closed
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
C# Exercism

Prêt à commencer Mapping objet-relationnel ?

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