webForumDet fria alternativet

ORM-teknik XML (c#)

6 svar · 703 visningar · startad av xcalibrate

xcalibrateMedlem sedan aug. 2002138 inlägg
#1

Hej!

Jag skulle vilja skapa en modul som fungerar ungefär såhär:

XMLMapperUser users = new XMLMapperUser();

...
foreach (XMLObjectUser user in users)
Console.WriteLine(user.Firstname);
...

Då har jag tänkt att XMLMapperUser skall vara nån typ av behållare för XMLObjectUser-objekt.
Men jag vill inte bara ha XMLMapperUser utan XMLMapperDog t.ex. också - så jag tänkte att jag kanske gör en abstrakt klass som heter XMLMapper.
Jag vill lagra all i XML, så jag funderade på om man skulle skapa nån XMLMapperWriter-klass som finns i XMLMapper som innehåller Insert-metoder osv. för att lägga till t.ex. en XMLObjectMapper i XMl-filen.
Jag har tittat på det här med object-mapper-teknik men hittar bara för sql/mysql-databaser osv.
Någon som vet hur jag på bästa (enligt objektorienterad utveckling) fixar till detta? Alltså bara SKALET, ingen beräkningskod utan t.ex.

public abstract class XMLMapper
{
XMLMapperWriter writer;
}

public abstract class XMLObject
{
}

public class XMLObjectUser : XMLObject
{
}

Men jag har lite problem att hitta en riktigt skön lösning, nån som kan hjälpa på traven?

emissionMedlem sedan dec. 19996 095 inlägg
#2

Eftersom du antagligen vill ha random access till objekten så bör du skapa en "lagringslager" som kan uppdatera XML-filen enkelt, gärna då via XmlDocument. Själva objekten kan då hålla en referens till sina respektive XmlNoder.

I praktiken känns dock strukturen osedvanligt knuten till sin lagringsmetod (med klasser som heter XMLObjectUser etc.), vilket sannolikt, men inte nödvändigtvis, är fel väg att gå.

Ta gärna en titt på http://www.gotdotnet.com/workspaces/workspace.aspx?id=5699d55a-83a2-42c7-8361-4815cd7cd736

xcalibrateMedlem sedan aug. 2002138 inlägg
#3

Okej låter bra, men alltså, i min XMLMapper vill jag ha ett par obligatoriska metoder som jag åstadkommer genom att göra metoderna abstrakta eller göra ett interface. Dock fick jag problem då jag insåg att jag har olika paramterar för varje XMLMapper. Te.x. XMLMapperUser vill jag ha Insert-funktion precis som XMLMapperDog, men för XMLMapperUser vill jag ha Insert(string firstName, string lastName) medan XMLMapperDog vill jag ha Insert(int tailLength) osv. - strider detta mot objektorierad struktur eller är jag på rätt spår?

JonMedlem sedan juli 20011 126 inlägg
#4

Är inte riktigt med på hur du tänker men om vi antar att du har din XMLMapperUser och XMLMapperDog så ser de kanske ut något i stil med:
XMLMapperUser.ID
XMLMapperUser.FirstName
XMLMapperUser.LastName

XMLMapperDog.Name
XMLMapperDog.TailLength

I Ditt XMLObject so du ärver av antar jag vidare att du har metoden
XMLObject.Save()
XMLObject.Delete()
osv.

Det du gör sen är att du gör en override på .Save() i din respektive klass, läser av dina egna parametrar och skriver ner dessa till datakällan (XML-Filen), gärna via någon mer generell datahanteringsklass.

Ett annat alternativ är att ha en klass som hanterar logiken typ XMLMapperDogRepository.Save(XMLMapperDog dog) som läser av properties från din dog.

xcalibrateMedlem sedan aug. 2002138 inlägg
#5

Förstår hur du tänker och gillar det, men alltså med min XMLMapperUser vill jag kunna xmlMapperUser.Insert(1, "Förnamn", "Efternamn") och på xmlMapperDog.Insert("svanslängd")

Så jag måste alltså ha olika paramterar men om jag skapar en metod i XMLMapper som heter Insert och ärver i XMLMapperUser kan jag inte ändra paramterarna utan måste ha den tom. Någon fiffig lösning?

Sen har jag XMLObjectWriter och XMLObjectReader som skriver till xml-filen (tror det är en bra lösning, annars ge mig gärna annan :)), men vet inte riktigt var jag skall ha referensen - i XMLMapper eller i XMLObject, eller i varje XMLObject-objekt - det är ju olika namn på xml-filerna för varje XMLObject. Kanske blev lite invecklat vet inte.

emissionMedlem sedan dec. 19996 095 inlägg
#6

Gör den parameterlösa metoden protected.

JonMedlem sedan juli 20011 126 inlägg
#7

Jag skulle tänka om lite och inte ta emot parametrar utan objekt.
Antingen har du en klass som ansvarar för hanteringen av de olika objekten och då blir det
xmlMapperUserRepository.InsertUser(1, "Förnamn", "Efternamn");

Eller så skapar du objektet och tar som inparameter
xmlMapperUser.Insert(new xmlMapperUser(1, "Förnamn", "Efternamn"))

Eller varför inte i så fall:
xmlMapperUser u = new xmlMapperUser();
u.Name = "Kalle";
u.Save();

SKa du nödvändigtvis ha det som du har gjort så kan du väl ha flera insert på din xmlMapperUser, bara du ser till att override:a den som finns i basklassen, vad du nu vill att den skall göra. Här är det nog läge att låta den ta ett XMLObject som inparameter i alla fall...

Genererad på 449 ms · cache AV · v20260730165559-full.f96bc7eb