90 likes | 190 Views
Data transfer object (DTO). Data transfer object – úvod. Problém Každé volání vzdáleného rozhraní je nákladná operace. Příklad : Přenášení dat mezi servisní vrstvou a uživatelským rozhraním Jak na to? Použít jednoduché třídy pro přenos více dat při každém volání.
E N D
Data transfer object – úvod • Problém • Každé volání vzdáleného rozhraní je nákladná operace. • Příklad: • Přenášení dat mezi servisní vrstvou a uživatelským rozhraním • Jak na to? • Použít jednoduché třídy pro přenos více dat při každém volání. • Známý také jako: Value Object, Transfer Object
Data transfer object – příklad Data transfer object Klient Přenášený objekt
Data transfer object – účastníci • Klient(Client) • Reprezentuje kontrolér aplikace • Data transfer object (ValueObject) • Serializovatelný objekt • Obsahuje pouze proměnné a jejich gettery a settery • Business object • Perzistentní objekt z databáze
Data transfer object – špatný postup • Pro přenos dat není vhodné používat entity (business objekty) • Transakční kontext končí na servisní vrstvě • Zabezpečení volání metod je také na servisní vrstvě • Odhalení vnitřního rozhraní aplikace • Entity nelze přenést do jiné VM – injektované závislosti neprojdou serializací a deserializací (nullpointer exception)
Data transfer object – jak na to • Jak na to • Servisní vrstva vrací jednoduché třídy pro přenos dat • Obsahují pouze proměnné a jejich gettery a settery • V případě referencí obsahují pouze ID • Kód těchto tříd lze bez problému poskytnout
Data transfer object – implementace public class PhotoDto extends AbstractDto { private Long offer; private String link; public PhotoDto() { } public PhotoDto(Long id, Long offer, String link) { this.id = id; this.offer = offer; this.link = link; } public String getLink() { return link; } public Long getOffer() { return offer; } public void setLink(String link) { this.link = link; } public void setOffer(Long offer) { this.offer = offer; } } • Ukázka dto
Data transfer object – použití • Ukázka tvorby dto • Hibernate tools public PhotoDto getPhotoById(Long id) { Photo p = genericDao.getByPropertyUnique("id", id, Photo.class); return new PhotoDto(p.getId(), HibernateTools.getIdentifier(p.getOffer()), p.getLink()); } public static Long getIdentifier(AbstractBusinessObject o) { if (o == null) { return null; } Long id = null; if (o instanceof HibernateProxy) { id = (Long) ((HibernateProxy) o).getHibernateLazyInitializer().getIdentifier(); } else { id = o.getId(); } return id; }
Data transfer object – nevýhody • Nevýhody • Značná duplikace kódu mezi DTO a entitami • V servisní vrstvě je nutný kód navíc pro převod z entit a jejich seznamů na ID