Якщо клас реалізує інтерфейс IDisposable, то його метод Dispose() потрібно викликати щоразу, коли екземпляр більше не потрібен. Зазвичай це роблять із блоку catch чи finally або з процедури Dispose() якогось викликача. Dispose() дає змогу звільнити некеровані ресурси, як-от обʼєкти операційної системи (якими не керує середовище виконання .NET), і скинути внутрішній стан керованих ресурсів.
Ми реалізуємо систему ORM (обʼєктно-реляційне відображення) поверх бази даних, яку надала інша команда.
База даних може обробляти лише одну транзакцію за раз.
На цьому етапі журналювання чи інша обробка помилок не потрібні.
Зауважмо, що внутрішньо база даних проходить через низку станів: Closed, TransactionStarted, DataWritten, Invalid, Closed. Можна розраховувати на те, що на початку кожної вправи база даних перебуває в стані Closed.
База даних має такі методи екземпляра:
Database.BeginTransaction() розпочинає транзакцію в базі даних. Якщо викликати його, коли база даних не перебуває в стані Closed, буде викинуто виняток. У разі успіху внутрішній стан бази даних зміниться на TransactionStarted.Database.Write(string data) записує дані в базу даних у межах транзакції. Якщо він отримає некоректні дані, буде викинуто виняток. Спроба викликати цей метод без виклику BeginTransaction() призведе до викидання винятку. У разі успіху внутрішній стан бази даних зміниться на DataWritten.Database.EndTransaction() фіксує транзакцію в базі даних. Він може викинути виняток, якщо не вдається закрити транзакцію або якщо Database.BeginTransaction() не було викликано.Database.Dispose() очистить базу даних, якщо під час транзакції було викинуто виняток. Це змінить стан бази даних на Closed.До стану бази даних можна отримати доступ за допомогою database.DbState.
Стан бази даних можна встановити одним із таких значень:
Реалізуйте Orm.Begin(), щоб розпочати транзакцію в базі даних. Якщо база даних не починає роботу у внутрішньому стані State.Closed, то буде викинуто InvalidOperationException.
var orm = new Orm(new Database());
orm.Begin();
// => database has an internal state of State.TransactionStarted
Реалізуйте Orm.Write(), щоб записати певні дані в базу даних. Якщо база даних не починає роботу у внутрішньому стані State.TransactionStarted або записано некоректні дані, то викидається InvalidOperationException. Якщо запис не вдається, то Orm має очистити базу даних.
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
Реалізуйте Orm.Commit(), щоб зафіксувати дані. Якщо фіксація не вдається, очистьте базу даних. Якщо база даних не починає роботу у внутрішньому стані State.DataWritten, то викидається InvalidOperationException.
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
Реалізуйте інтерфейс IDisposable у класі Orm. Цей виклик гарантовано завершиться успішно.
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
Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.