webForumDet fria alternativet

Mappa Gui och domänentitet?

.NET

17 svar · 746 visningar · startad av Lukaspojken

Medlem sedan maj 20011 312 inlägg
Frågan#1

Finns det några bra sätt att mappa domänentiter med GUI-kontroller som textbox m.m?,

Medlem sedan dec. 19996 522 inlägg
#2

Vad menar du med att mappa? Exemplifiera vad du vill åstakomma tack.

Medlem sedan maj 20012 812 inlägg
#3

Det bästa sättet är ett skapa en PresentationsEntitet som håller alla den information som du behöver för just den "vyn" och denna presentationEntitet mappar du sedan mot de olika domänentiteter som du behöver för att få fram alla information.

Då blir dina domänentiter aldrig beroende av hur ditt presentationslager ser ut, det blir dock en j**la massa mappande fram och tillbaka...

Sedan själva mappningsförfarandet mellan presentationsmodellen och GUI:ets kontroller kan man lösa på olika sätta. Det smidigaste är att använda sig av DataBinding, men det enklaste är vanlig hederlig mappning mellan kontrollen och entiteten, dels när "vyn" laddas, och dels tillbaka till entiteterna när du trycker på save knappen.

- M

Medlem sedan dec. 19996 522 inlägg
#4

Ang mappning, kolla in http://www.codeplex.com/AutoMapper, http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/01/22/automapper-the-object-object-mapper.aspx så slipper man hålla på och mecka själv så mycket.

Medlem sedan maj 20011 312 inlägg
#5

Det jag mer tänkte på var automatisk mappning mellan domänentiteter och GUI-kontroller (Inte mappning av domänentiteter till tex DTO:r. Finns det några bra verktyg för detta?

Jag minns att jag för ett bra tag sedan tittade snabbt på detta med databinding av entiteter. Men jag är lite osäker på om det löste mappning både fram och tillbaka, dvs från entitet till kontroll och tvärtom.

Medlem sedan aug. 20003 575 inlägg
#6

Efter att ha arbetat med ViewModel så måste jag säga att det är extremt trevligt även om det blir lite mer kodande. ViewModel är väl ungefär samma sak som Gladh beskrev det som men med ett annat namn och några mindre förändringar men grundtanken är densamma.

Medlem sedan feb. 20002 300 inlägg
#7

Jag använder mig också av MVVM och kan rekommenderar det. Det fungerar klockrent i WPF.

Medlem sedan maj 20011 312 inlägg
#8

-> Nickemannen
Har du någon bra sida som tar upp ViewModel?

Denna sida tar upp ett enkelt exempel på MVVM
http://www.codeproject.com/KB/WPF/MVVMForDummies.aspx?fid=1540918&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=3055626

Medlem sedan dec. 19996 522 inlägg
Medlem sedan maj 20011 312 inlägg
#10

Finns det någon nackdel att använda sådana här mappningsverktyg?

Medlem sedan dec. 19996 522 inlägg
#11

Som alltid får man göra avkall på en del prestanda.

Medlem sedan maj 20011 312 inlägg
#12

Jag har läst en del av artikel men jag tycker att det känns onödigt komplext. Sedan gillar jag inte det med hårdkodning av property-namn (jag önskar verkligen Microsoft kan fixa till detta någon gång), dvs detta gillar jag inte alls:

public string FirstName
{
    get { return _customer.FirstName; }
    set
    {
        if (value == _customer.FirstName)
            return;
        _customer.FirstName = value;
        base.OnPropertyChanged([B]"FirstName"[/B]);
    }
}

Jag skulle vilja att man skulle kunna göra något i stil med

public string FirstName
{
    get { return _customer.FirstName; }
    set
    {
        if (value == _customer.FirstName)
            return;
        _customer.FirstName = value;
        base.OnPropertyChanged([B]Customer.FirstName.PropertyName[/B]);
    }
}

Förresten är det någon som testat att skapa en egen GUI-kontroll-mapper? Det skulle vara kul att ta fram en.

Medlem sedan maj 20012 812 inlägg
#13

lukaspojken skrev:

public string FirstName
{
get { return _customer.FirstName; }
set
{
if (value == _customer.FirstName)
return;
_customer.FirstName = value;
base.OnPropertyChanged(Customer.FirstName.PropertyName);
}
}

Jag gör så är, vilket är nästan som det du vill...

public string FirstName
{
    get { return _customer.FirstName; }
    set
    {
        if (value == _customer.FirstName)
            return;
        _customer.FirstName = value;
        base.OnPropertyChanged(nameOf<Customer>.Property(p => p.FirstName));
    }
}

Då får jag det typsäkert, och skulle man ändra namnet på FirstName så får du ett kompileringsfel...

Problemet med databinding är att ändringarna slår igenom direkt, så fort du ändrat så ändrar du hela vägen ner till det du binder, vilket gör att du själv måste implementera möjligheten att "rulla" tillbaka dina ändringar som du gör i din "vy".

IEditableObject interfacet kan hjälpa dig med det. Själv löste jag det så att när min WPF-formulär laddades så kördes BeginEdit() och alla värden på entiteten sparades undan, och om man ändrar något på någon entitet så sätts Edit-flagan till sant, och när man stänger sin WPF-form så kontrolleras om Edit-flagan är sann. Är den det så får man frågan om man vill spara sina ändringar eller inte. Vill man inte spara dem, så får man kopiera tillbaka alla de sparade värden.

Och just här hade jag en del strul med MVVM och Command. Jag fick bara inte skapa ett command på onClosing eventet som finns på WPF-fönsterna, och det gjorde att jag inte kunde köra MVVM hela vägen som jag ville..

- M

Medlem sedan aug. 20003 575 inlägg
#14

Kunde du inte skapa ett Command eller anropa ett Command, jag brukar skapa upp Command's i konstruktorn som jag binder till.

Medlem sedan maj 20011 312 inlägg
#15

Skulle man inte kunna implementera onPropertyChanged på domänentiteten. Samt att bara loopa ut kontrollerna på sidan och mappa dessa, typ DataBind<Customer>(controls). Det borde vara den enklaste formen av mappning. Mappningen kan definieras antingen i xml eller via attribut på kontrollerna. Vad tror ni om en sådan lösning?

Medlem sedan aug. 20003 575 inlägg
#16

Absolut skulle man kunna ha implemmentera INotifyPropertyChanged på domänentiteten, men jag vill helst inte koppla in UI teknik i min domänmodell, för jag anser att INotifyPropertyChanged är en UI teknik. Samt att arbetar man med WPF kan det finnas lite andra designspecifik data på sitt objekt. ViewModel är så mycket mer än bara datamappning. Du får också bättre koll med IEditable objekt om du skulle köra mappning,

Medlem sedan maj 20012 812 inlägg
#17

nickemannen skrev:

Kunde du inte skapa ett Command eller anropa ett Command, jag brukar skapa upp Command's i konstruktorn som jag binder till.

Jag kunde inte skapa ett command för OnClosing-eventet som finns på WPF-formen. Och jag var ganska beroende av det eventet... så därför blev det inte riktigt så som jag ville...

- M

Medlem sedan aug. 20003 575 inlägg
#18

Vad händer om du försöker köra kommandot med programmeringskod i OnClosing eventet, dvs att du lyssnar på OnClosingEventet

(DataSources as XXXViewModel).XXXXCommand.Execute(this, null)

268 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)