Percursos
/
C#
C#
/
Exercícios
/
Mapeamento objeto-relacional
Mapeamento objeto-relacional

Mapeamento objeto-relacional

Exercício de aprendizagem

Introdução

Limpeza de recursos

Se uma classe implementa a interface IDisposable, o seu método Dispose() tem de ser chamado sempre que uma instância deixa de ser necessária. Isto costuma ser feito a partir de uma cláusula catch ou finally, ou a partir da rotina Dispose() de quem a chama. O Dispose() dá a oportunidade de libertar recursos não geridos, como objetos do sistema operativo (que não são geridos pelo runtime do .NET), e de repor o estado interno dos recursos geridos.

Instruções

Estás a implementar um sistema ORM (mapeamento objeto-relacional) sobre uma base de dados que foi disponibilizada por outra equipa.

A base de dados consegue processar uma única transação de cada vez.

Nesta fase, não é preciso registar nada nem fazer qualquer outro tratamento de erros.

Repara que, internamente, a base de dados passa por vários estados: Closed, TransactionStarted, DataWritten, Invalid, Closed. Podes contar com o facto de a base de dados estar no estado Closed no início de cada exercício.

A base de dados tem os seguintes métodos de instância:

  • Database.BeginTransaction() inicia uma transação na base de dados. Se for chamado quando a base de dados não está no estado Closed, é lançada uma exceção. Se for bem-sucedido, o estado interno da base de dados passa a TransactionStarted.
  • Database.Write(string data) escreve dados na base de dados dentro da transação. Se receber dados inválidos, é lançada uma exceção. Uma tentativa de chamar este método sem que BeginTransaction() tenha sido chamado provoca o lançamento de uma exceção. Se for bem-sucedido, o estado interno da base de dados passa a DataWritten.
  • Database.EndTransaction() confirma a transação na base de dados. Pode lançar uma exceção se não conseguir fechar a transação ou se Database.BeginTransaction() não tiver sido chamado.
  • Uma chamada a Database.Dispose() limpa a base de dados se for lançada uma exceção durante uma transação. Isto muda o estado da base de dados para Closed.

Podes aceder ao estado da base de dados através de database.DbState.

O estado da base de dados pode ser definido como um dos seguintes:

  • TransactionStarted
  • DataWritten
  • Invalid
  • Closed

1. Inicia uma transação

Implementa Orm.Begin() para iniciar uma transação na base de dados. Se a base de dados não começar com um estado interno State.Closed, é lançada uma InvalidOperationException.

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

2. Escreve alguns dados na base de dados

Implementa Orm.Write() para escrever alguns dados na base de dados. Se a base de dados não começar com um estado interno State.TransactionStarted ou se forem escritos dados inválidos, é lançada uma InvalidOperationException. Se a escrita falhar, o Orm tem de limpar a base de dados.

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. Confirma na base de dados os dados escritos anteriormente

Implementa Orm.Commit() para confirmar os dados. Se a confirmação falhar, limpa a base de dados. Se a base de dados não começar com um estado interno State.DataWritten, é lançada uma 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

4. Garante que a base de dados é limpa corretamente se o ORM tiver de fechar a meio de uma transação.

Implementa a interface IDisposable na classe Orm. A chamada é garantidamente bem-sucedida.

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
Editar via GitHub A ligação abre numa nova janela ou separador
C# Exercism

Estás pronto para começar Mapeamento objeto-relacional?

Inscreve-te no Exercism para aprenderes e dominares C# com 62 conceitos178 exercícios, e mentoria humana real, tudo grátis.