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.
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.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 :
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
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
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
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
Inscris-toi sur Exercism pour apprendre et maîtriser C# avec 62 concepts178 exercices, et un vrai mentorat humain, le tout gratuitement.