Tracks
/
C#
C#
/
Ejercicios
/
ORM de una sola vez
ORM de una sola vez

ORM de una sola vez

Ejercicio de aprendizaje

Introducción

Ciclo de vida de los recursos

resource-cleanup usa la interfaz IDispose para indicar que el recurso de algún objeto, u otro estado del programa, necesitaba liberarse o restablecerse cuando el objeto ya no se necesitaba (y que confiar en el recolector de basura no lograría esto ni daría el nivel de control requerido), y que el método IDisposable.Dispose() era el lugar natural para esas operaciones de limpieza.

Existe otra construcción, el bloque using, que permite, desde la perspectiva de quien llama, reunir toda la gestión del ciclo de vida de los recursos en una sola sentencia.

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

En el ejemplo anterior, los recursos del sistema de archivos asociados con file se liberarán de vuelta al sistema operativo cuando se salga del bloque using.

Para que el patrón funcione, la variable de la sentencia using debe ser un tipo de referencia que implemente la interfaz IDisposable y debe liberar recursos o restablecer el estado del programa en su método Dispose().

C# 8 introduce un refinamiento del patrón. Una sentencia using puede colocarse al principio de un bloque.

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

Es posible que quienes programan en Java reconozcan esto como un análogo del mecanismo de gestión automática de recursos que se introdujo en Java 7.

Instrucciones

Vuelves a trabajar en el sistema ORM (mapeo objeto-relacional) que se presentó en object-relational-mapping.

Nuestro análisis del uso del ORM muestra que el 95% de las transacciones se ejecutan desde un único método que hace la llamada, y se ha decidido que sería más apropiado tener un solo método del ORM que abriera, escribiera y confirmara una transacción.

La base de datos tiene los siguientes métodos de instancia:

  • Database.BeginTransaction() inicia una transacción en la base de datos.
  • Database.Write(string data) escribe datos en la base de datos dentro de la transacción. Si recibe datos incorrectos, se lanzará una excepción. Un intento de llamar a este método sin que se haya llamado antes a BeginTransaction() provocará que se lance una excepción. Si tiene éxito, el estado interno de la base de datos cambiará a DataWritten.
  • Database.EndTransaction() confirma la transacción en la base de datos. Puede lanzar una excepción si no puede cerrar la transacción o si no se ha llamado a Database.BeginTransaction().
  • Una llamada a Database.Dispose() limpiará la base de datos si se lanza una excepción durante una transacción. Esto cambiará el estado de la base de datos a Closed.

1. Escribir en la base de datos

Implementa el método Orm.Write() para iniciar una transacción de base de datos, escribir los datos que se pasan y confirmar la transacción. Todas las excepciones, incluida InvalidOperationException, deben poder propagarse a quien hizo la llamada, sin registrarlas ni intervenir de ninguna otra forma.

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. Escribir en la base de datos y devolver a quien hizo la llamada una indicación de si la escritura fue exitosa

Han pasado unos meses desde que se introdujo Orm.Write() y hay división en el equipo. A muchos desarrolladores les gustaría que el ORM gestionara los errores cuando se lanzan excepciones y que simplemente devolviera a quien hizo la llamada una indicación de éxito.

Implementa el método Orm.WriteSafely() para iniciar una transacción de base de datos, escribir los datos que se pasan y confirmar la transacción (igual que antes). Debe devolver true si la escritura fue exitosa; de lo contrario, false. No intentes registrar la excepción en el log.

Database db = new Database();
Orm orm = new Orm(db);
orm.WriteSafely("good write");
// => true
orm.WriteSafely("bad write");
// => false
orm.WriteSafely("bad commit");
// => false
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
C# Exercism

¿Todo listo para empezar ORM de una sola vez?

Regístrate en Exercism para aprender y dominar C# con 62 conceptos178 ejercicios y mentoría humana real, todo gratis.