inspiro skrev:
En båt och en bil kanske sparas med olika värden i olika tabeller, då får man väl en rörigare save-metod istället än om man har en save i respektive klass som är anpassad för ett visst objekt?
Ja och inte bara båt och bil, utan även flyplan och motorcykel och lastbil och....
Som du förstår så måste du flytta ut relationen mellan din klass och din databas någon annanstans och bara låta din save bygga upp en unik save SQL för respektive objekt. Det gör man med metadata. Alltså data som beskriver något, här är ett exempel:
[DataTable("Bilar", Database.SqlServer)]
public class Car
{
[Identifier(IdentifierType.Sequenze)]
[DataField("Id")]
private long _Identifier;
[DataField("Namn")]
private string _Name;
[DataField("Farg")]
private Color _Color;
}
Här har du en klass som heter Bil, denna klassen innehåller även metadata över hur denns databasstruktur ser ut. Den finns i en tabel som heter Bilar, och databasen är en SQLServer databas. den har fält som heter ID, Namn och Farg, och vi vet även vilka medlemar som skall hämta/spara sina värden till vilka kolumner i databasen.
Man kan nu göra en generell metod som tar emot en Car hämtar ut metadatan från den och bygger ihop en SQL sats och fyller denna med värden från membervariablerna och sedan exekveras till databasen, och vips så har du sparat ner dina bilar till databasen. Och när det gäller båten så ser det ut så här.
[DataTable("Batar", Database.MySq)]
public class Boar
{
[Identifier(IdentifierType.Sequenze)]
[DataField("Id")]
private long _Identifier;
[DataField("TypAvBat")]
private string _Type;
[DataField("Langd")]
private int _Length;
}
Båda dessa klasser kan nu sparas ner med samma Save() metod, och alla andra nya klasser som du skriver också kan sparas ner med samma savemetod så länge de innehåller samma metadata.
I just detta exempel så ligger metadatan inne i klassen som attributte, det är båda bra och dåligt, så många väljer att lägga dem i separata XML-filer så man skall kunna gå in och ändra i dem utan att man behöver bygga om koden. Man kan även lägga metadatan i en egen databas om man hellre vill det. Det viktiga är inte var det ligger utan att den finns där.
P skrev:
Vad är T och K i PersistableClass<T,K>???
Det har att göra med Generics och i detta exemplet så står T för typen av objekt som du önskar operera på, och K står för din typ av sökdata som du skickar in.
Det betydar att med .Find(T type, K id), så kan du skicka in vilket objekt som helst som T och vilken söksträng som K.
Alltså är det korrekt att skriva.
Bilar.Save(bil, 10);
eller
Batar.Save(bat1, "Kalle")
Båda save metoderna kommer att kalla på samma save metod i Persistans klassen, fast det är olika inputtyper som du anropar den med.
- M