SlideShare ist ein Scribd-Unternehmen logo
1 von 7
Object-Object Mapper
Object-Object Mapper
- Nutzen des Object-Object Mapper
- Framework: AutoMapper
- Framework: ValueInjecter
- AutoMapper vs. ValueInjector
Nutzen des Object-Object Mapper
• Konvertierung von Objekt zu Objekt oder übertragen
von verschiedenen Objektstrukturen
• Vereinfacht eine Schichtentrennung. Behandlung der
Typenkonvertierung wird nur einmal definiert
• Reduktion von potentiellen Fehlerquellen bei der
Konvertierung von komplexen Objekten durch
Automatisierung
• Einfache und Komplexe Regeln zur Konvertierung
abbildbar
• Wartung, Erweiterung und Testbarkeit verbessern
AutoMapper
• Objekt-Objekt Mapping Standart-Konfiguration
• Property Zuordnung über Name
• Zuordnung Ziel Property Name = Quell Methode
• sClass.ZylinderCount() => tClass.ZylinderCount;
• SourceClass.GetXXX() => TargetClass.XXX;
• Zuordnung des Property durch PascalCase bei Complex-
Types:
• sClass.Engine.ModelNumber =>
tClass.EngineModelNumber;
• sClass.EngineModelNumber =>
tClass.Engine.ModelNumber
• Profile zur zentralen Verwaltung von Konfiguration
Mapper.Initialize<c => c.AddProfile<SampleProfile>())
• Behandlung von eigenen Transformationslogik
Mapping.Map<Employee,EmployeeService>().ForMember(d =>
d.Years, o => o.MapFrom(s => (DateTime.Now –
s.HireDate).TotalDays/365));
• Unterstützt Property-Ignorance configuration
Mapper.CreateMap<Employee, EmployeeStats>().ForMember(d
=> d.SickDaysUsed, o => o.Ignore());
Mapper.AsserConfigurationIsValid();
• Explizite Konfigurations-Fehlerbehandlung zur
Fehlerbehandlung/Debugging
Mapper.AssertConfigurationIsValid();
• Benutzung von eigenen Resolver zur Transformation von
Werten („Custom value resolver“)
Mapper.CreateMap<Employee, EmployeeService>().ForMember(d =>
d.Years, o => o.ResolveUsing<>earsOfServiceResolver>();
class YearsOfServiceResolver : ValueResolver<Employee, int>
{
protected override int ResolveCore(Employee source)
{
…
return (int) anyValue;
}
}
• Benutzung von eigenen Typen-Konvertern („Custom
type converters“) durch die Implementierung von
ITypeConverter<Tsource,Ttarget>
Mapper.CreateMap<double,DateTime().ConvertUsing<MyCustom
Converter>
• Pre- und Post Mapping Actions
Mapper.CreateMap<SelectedJob, Job().BeforeMap((s, d,)=>
..);
Mapper.CreateMap<SelectedJob, Job().AfterMap((s, d,)=>
..);
• Kontrolle ober die Instanziierung des Zielobjekts durch
Lambda oder Konfiguration
Mapper.CreateMap<Foo,Fighter>().ConstructUsing(s =>
factory.GetFighter()).ForMember(d => d.Id, o =>
o.Ignore()).ForMember(d => d.Type, o => o.MapFrom(s =>
„NINJA“));
ValueInjecter
• Statische Methode zum Mappen von und zu
einem Type
.InjectFrom<ConventionType>() oder .InjectFrom()
• Im einfachsten Fall mapped ValueInject den Property
des Zielobjektes mit dem gleichen Namen und Type.
Bsp.: string sClass.PropertyName => string
tClass.PropertyName
• Automatisches Mappen ohne Konfiguration
targetObject.InjectFrom(sourceObject);
• Gleichzeitiges Mapping mehrerer Objektinstanzen
targetObject.InjectFrom(source1,source2);
• Erweiterbarkeit der Mapping-Konvention
public class IdToType_Id : ConventionInjection
{
protected override bool Match(ConventionInfo c)
{
return c.SourceProp.Name==„Id“ && c.TargetProp.Name
== c.Source.Type.Name + „_Id“;
}
}
• Bereits vorhandene ConventionTypes
• ValueInjection
• LoopValueInjection
• LoopValueInjection<TSourceProperty, TTargetProperty>
• FlatLoopValueInjection
• FlatLoopValueInjection<TSourceProperty, TTargetProperty>
• UnflatLoopValueInjection
• UnflatLoopValueInjection<TSourceProperty, TTargetProperty>
• KnownSourceValueInjection<TSource>
• KnownTargetValueInjection<TTarget>
• BuiltIn Flattening und Unflattening-Unterstützung
(Auflösung und Erstellen von komplexen
Objektstrukturen)
AutoMapper vs. ValueInjecter
AutoMapper
• Eigene Transformationslogik möglich
• Custom Type Konverter
• Custom Value Resolver
• Ausdruck in Linq
• Pre- und Post-Action Methoden zu Vor- und
Nachbehandlung der Transformation
• Explizite Fehlerbehandlung von
Transformationsobjekten (z.B. fehlende Zuordnung von
Properties)
• Explizites ignorieren von Properties notwendig
• Methoden/Property Mapping
• Mapping von ComplexTypes durch PascalCasing
• Unterstützt auch das Mapping von instanziierten
Objekten
ValueInjecter
• Ohne eigene Convention wird nur gemapped wenn
Property Name und Type von Quelle und Ziel
identisch sind
• Erweiterung durch Ableitung von
ConventionInjectionTypes sehr flexibel
• Durch ConventionBased Injection sehr schnell
(teilweise doppelt so schnell als AutoMapper)
• Mapping von anonymous und dynamic types
Weiterführende Links zum Thema
• AutoMapper
https://github.com/AutoMapper
• ValueInjecter
http://valueinjecter.codeplex.com/
• Vorteile von ValueInjecter, erklärt vom Author von ValueInjecter
http://stackoverflow.com/questions/4663577/automapper-vs-valueinjecter
• Performance Benchmark AutoMapper
http://lostechies.com/jimmybogard/2009/08/05/analyzing-automapper-performance

Weitere ähnliche Inhalte

Andere mochten auch

Méthodologie OVAR et Intelligence Projective au centre Culturel Candien
Méthodologie OVAR et Intelligence Projective au centre Culturel CandienMéthodologie OVAR et Intelligence Projective au centre Culturel Candien
Méthodologie OVAR et Intelligence Projective au centre Culturel CandienClémence Bertrand-Jaume
 
1,001 facts that will scare the s#t out of you the ultimate bathroom reader
1,001 facts that will scare the s#t out of you the ultimate bathroom reader1,001 facts that will scare the s#t out of you the ultimate bathroom reader
1,001 facts that will scare the s#t out of you the ultimate bathroom readerBrian Munene
 
Persamaan garis singgung lingkaran
Persamaan garis singgung lingkaranPersamaan garis singgung lingkaran
Persamaan garis singgung lingkaranNadia Hasan
 
2013.03.14 sessie d westland
2013.03.14 sessie d westland2013.03.14 sessie d westland
2013.03.14 sessie d westlandPraktijkleerstoel
 
Kap 5 Jeopardy
Kap 5 JeopardyKap 5 Jeopardy
Kap 5 Jeopardyfraubooth
 

Andere mochten auch (7)

Cachoeira 2
Cachoeira 2Cachoeira 2
Cachoeira 2
 
Méthodologie OVAR et Intelligence Projective au centre Culturel Candien
Méthodologie OVAR et Intelligence Projective au centre Culturel CandienMéthodologie OVAR et Intelligence Projective au centre Culturel Candien
Méthodologie OVAR et Intelligence Projective au centre Culturel Candien
 
1,001 facts that will scare the s#t out of you the ultimate bathroom reader
1,001 facts that will scare the s#t out of you the ultimate bathroom reader1,001 facts that will scare the s#t out of you the ultimate bathroom reader
1,001 facts that will scare the s#t out of you the ultimate bathroom reader
 
Persamaan garis singgung lingkaran
Persamaan garis singgung lingkaranPersamaan garis singgung lingkaran
Persamaan garis singgung lingkaran
 
Biotecnologia
BiotecnologiaBiotecnologia
Biotecnologia
 
2013.03.14 sessie d westland
2013.03.14 sessie d westland2013.03.14 sessie d westland
2013.03.14 sessie d westland
 
Kap 5 Jeopardy
Kap 5 JeopardyKap 5 Jeopardy
Kap 5 Jeopardy
 

Object object mapper

  • 2. Object-Object Mapper - Nutzen des Object-Object Mapper - Framework: AutoMapper - Framework: ValueInjecter - AutoMapper vs. ValueInjector
  • 3. Nutzen des Object-Object Mapper • Konvertierung von Objekt zu Objekt oder übertragen von verschiedenen Objektstrukturen • Vereinfacht eine Schichtentrennung. Behandlung der Typenkonvertierung wird nur einmal definiert • Reduktion von potentiellen Fehlerquellen bei der Konvertierung von komplexen Objekten durch Automatisierung • Einfache und Komplexe Regeln zur Konvertierung abbildbar • Wartung, Erweiterung und Testbarkeit verbessern
  • 4. AutoMapper • Objekt-Objekt Mapping Standart-Konfiguration • Property Zuordnung über Name • Zuordnung Ziel Property Name = Quell Methode • sClass.ZylinderCount() => tClass.ZylinderCount; • SourceClass.GetXXX() => TargetClass.XXX; • Zuordnung des Property durch PascalCase bei Complex- Types: • sClass.Engine.ModelNumber => tClass.EngineModelNumber; • sClass.EngineModelNumber => tClass.Engine.ModelNumber • Profile zur zentralen Verwaltung von Konfiguration Mapper.Initialize<c => c.AddProfile<SampleProfile>()) • Behandlung von eigenen Transformationslogik Mapping.Map<Employee,EmployeeService>().ForMember(d => d.Years, o => o.MapFrom(s => (DateTime.Now – s.HireDate).TotalDays/365)); • Unterstützt Property-Ignorance configuration Mapper.CreateMap<Employee, EmployeeStats>().ForMember(d => d.SickDaysUsed, o => o.Ignore()); Mapper.AsserConfigurationIsValid(); • Explizite Konfigurations-Fehlerbehandlung zur Fehlerbehandlung/Debugging Mapper.AssertConfigurationIsValid(); • Benutzung von eigenen Resolver zur Transformation von Werten („Custom value resolver“) Mapper.CreateMap<Employee, EmployeeService>().ForMember(d => d.Years, o => o.ResolveUsing<>earsOfServiceResolver>(); class YearsOfServiceResolver : ValueResolver<Employee, int> { protected override int ResolveCore(Employee source) { … return (int) anyValue; } } • Benutzung von eigenen Typen-Konvertern („Custom type converters“) durch die Implementierung von ITypeConverter<Tsource,Ttarget> Mapper.CreateMap<double,DateTime().ConvertUsing<MyCustom Converter> • Pre- und Post Mapping Actions Mapper.CreateMap<SelectedJob, Job().BeforeMap((s, d,)=> ..); Mapper.CreateMap<SelectedJob, Job().AfterMap((s, d,)=> ..); • Kontrolle ober die Instanziierung des Zielobjekts durch Lambda oder Konfiguration Mapper.CreateMap<Foo,Fighter>().ConstructUsing(s => factory.GetFighter()).ForMember(d => d.Id, o => o.Ignore()).ForMember(d => d.Type, o => o.MapFrom(s => „NINJA“));
  • 5. ValueInjecter • Statische Methode zum Mappen von und zu einem Type .InjectFrom<ConventionType>() oder .InjectFrom() • Im einfachsten Fall mapped ValueInject den Property des Zielobjektes mit dem gleichen Namen und Type. Bsp.: string sClass.PropertyName => string tClass.PropertyName • Automatisches Mappen ohne Konfiguration targetObject.InjectFrom(sourceObject); • Gleichzeitiges Mapping mehrerer Objektinstanzen targetObject.InjectFrom(source1,source2); • Erweiterbarkeit der Mapping-Konvention public class IdToType_Id : ConventionInjection { protected override bool Match(ConventionInfo c) { return c.SourceProp.Name==„Id“ && c.TargetProp.Name == c.Source.Type.Name + „_Id“; } } • Bereits vorhandene ConventionTypes • ValueInjection • LoopValueInjection • LoopValueInjection<TSourceProperty, TTargetProperty> • FlatLoopValueInjection • FlatLoopValueInjection<TSourceProperty, TTargetProperty> • UnflatLoopValueInjection • UnflatLoopValueInjection<TSourceProperty, TTargetProperty> • KnownSourceValueInjection<TSource> • KnownTargetValueInjection<TTarget> • BuiltIn Flattening und Unflattening-Unterstützung (Auflösung und Erstellen von komplexen Objektstrukturen)
  • 6. AutoMapper vs. ValueInjecter AutoMapper • Eigene Transformationslogik möglich • Custom Type Konverter • Custom Value Resolver • Ausdruck in Linq • Pre- und Post-Action Methoden zu Vor- und Nachbehandlung der Transformation • Explizite Fehlerbehandlung von Transformationsobjekten (z.B. fehlende Zuordnung von Properties) • Explizites ignorieren von Properties notwendig • Methoden/Property Mapping • Mapping von ComplexTypes durch PascalCasing • Unterstützt auch das Mapping von instanziierten Objekten ValueInjecter • Ohne eigene Convention wird nur gemapped wenn Property Name und Type von Quelle und Ziel identisch sind • Erweiterung durch Ableitung von ConventionInjectionTypes sehr flexibel • Durch ConventionBased Injection sehr schnell (teilweise doppelt so schnell als AutoMapper) • Mapping von anonymous und dynamic types
  • 7. Weiterführende Links zum Thema • AutoMapper https://github.com/AutoMapper • ValueInjecter http://valueinjecter.codeplex.com/ • Vorteile von ValueInjecter, erklärt vom Author von ValueInjecter http://stackoverflow.com/questions/4663577/automapper-vs-valueinjecter • Performance Benchmark AutoMapper http://lostechies.com/jimmybogard/2009/08/05/analyzing-automapper-performance

Hinweis der Redaktion

  1. Im Bildschirmpräsentationsmodus klicken Sie auf den Pfeil, um zum Center für erste Schritte mit PowerPoint zu gelangen.