Vad menar du med att mappa? Exemplifiera vad du vill åstakomma tack.
Finns det några bra sätt att mappa domänentiter med GUI-kontroller som textbox m.m?,
17 svar · 746 visningar · startad av Lukaspojken
Finns det några bra sätt att mappa domänentiter med GUI-kontroller som textbox m.m?,
Vad menar du med att mappa? Exemplifiera vad du vill åstakomma tack.
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
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.
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.
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.
Jag använder mig också av MVVM och kan rekommenderar det. Det fungerar klockrent i WPF.
-> 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
Finns det någon nackdel att använda sådana här mappningsverktyg?
Som alltid får man göra avkall på en del prestanda.
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.
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
Kunde du inte skapa ett Command eller anropa ett Command, jag brukar skapa upp Command's i konstruktorn som jag binder till.
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?
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,
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
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)