Kurzusok
/
C#
C#
/
Feladatok
/
ORM egy menetben
ORM egy menetben

ORM egy menetben

Tanulófeladat

Bevezetés

Erőforrás élettartama

resource-cleanup az IDispose interfészt használja annak jelzésére, hogy egy objektum erőforrását vagy más programállapotát fel kell szabadítani vagy vissza kell állítani, amikor az objektumra már nincs szükség (és hogy a szemétgyűjtőre támaszkodva ez nem valósulna meg, illetve nem biztosítaná a szükséges szintű kontrollt), valamint hogy az IDisposable.Dispose() metódus a természetes hely az ilyen takarítási műveletekhez.

Létezik egy másik szerkezet is, a using blokk, amely a hívó szemszögéből lehetővé teszi, hogy az összes erőforrás élettartamának kezelését egyetlen utasításba gyűjtsük.

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

A fenti példában a file-hoz kapcsolódó fájlrendszer-erőforrások visszaadódnak az operációs rendszernek, amikor a using blokkból kilépünk.

Ahhoz, hogy a minta működjön, a using utasításban szereplő változónak referenciatípusnak kell lennie, amely megvalósítja az IDisposable interfészt, és a Dispose() metódusában fel kell szabadítania az erőforrásokat, illetve vissza kell állítania a program állapotát.

A C# 8 finomítást vezet be a mintába. A using utasítás egy blokk elejére helyezhető.

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

A Java-fejlesztők felismerhetik ezt a Java 7-ben bevezetett automatikus erőforrás-kezelés mechanizmus analógjaként.

Utasítások

Újra az ORM (objektum-relációs leképezés) rendszeren dolgozol, amelyet a object-relational-mapping feladatban ismertettünk.

Az ORM használatát vizsgáló elemzésünk szerint a tranzakciók 95%-a egyetlen hívó metódusból indul ki, ezért úgy döntöttünk, hogy célszerűbb lenne egyetlen olyan ORM-metódus, amely megnyitja, kiírja és véglegesíti a tranzakciót.

Az adatbázisnak a következő példánymetódusai vannak:

  • Database.BeginTransaction() elindít egy tranzakciót az adatbázison.
  • Database.Write(string data) adatot ír az adatbázisba a tranzakción belül. Ha hibás adatot kap, kivétel dobódik. Ha úgy próbálod meghívni ezt a metódust, hogy előtte nem hívtad meg a BeginTransaction() metódust, kivétel dobódik. Sikeres hívás esetén az adatbázis belső állapota DataWritten lesz.
  • Database.EndTransaction() véglegesíti a tranzakciót az adatbázisban. Kivételt dobhat, ha nem sikerül lezárnia a tranzakciót, vagy ha a Database.BeginTransaction() metódust nem hívták meg.
  • A Database.Dispose() hívása rendbe teszi az adatbázist, ha a tranzakció közben kivétel dobódik. Ekkor az adatbázis állapota Closed lesz.

1. Írj az adatbázisba

Valósítsd meg az Orm.Write() metódust úgy, hogy elindít egy adatbázis-tranzakciót, kiírja a kapott adatot, majd véglegesíti a tranzakciót. Minden kivételt, az InvalidOperationException-t is beleértve, hagyni kell, hogy eljusson a hívóhoz, naplózás vagy bármilyen más beavatkozás nélkül.

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. Írj az adatbázisba, és jelezd a hívónak, hogy az írás sikeres volt-e

Néhány hónap telt el azóta, hogy bevezettük az Orm.Write() metódust, és megosztott a csapat. Sok fejlesztő szeretné, ha az ORM kezelné a hibákat, amikor kivétel dobódik, és egyszerűen csak a siker jelzését adná vissza a hívónak.

Valósítsd meg az Orm.WriteSafely() metódust úgy, hogy elindít egy adatbázis-tranzakciót, kiírja a kapott adatot, majd véglegesíti a tranzakciót (a fentiek szerint). true-t adjon vissza, ha az írás sikeres volt, egyébként false-t. Ne próbáld naplózni a kivételt.

Database db = new Database();
Orm orm = new Orm(db);
orm.WriteSafely("good write");
// => true
orm.WriteSafely("bad write");
// => false
orm.WriteSafely("bad commit");
// => false
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
C# Exercism

Készen állsz elkezdeni a(z) ORM egy menetben feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) C# nyelvet 62 fogalom178 feladat segítségével, valódi emberi mentorálással, mindez ingyen.