/products/{sku} GET /shoppingcart/{uuid} PUT /shoppingcart/{uuid}/items Produktbild: http://tinobusiness.com/wp-content/uploads/2015/09/CONSUMER-PRODUCTS-e1442909155136.jpg
= "[\\w\\d]{5,20}".toRegex() return if(skuRegex.matches(sku)) { val cart = service.addProduct(uuid, sku) … } else { ResponseEntity.badRequest().body("sku is not valid") } } Controller Also hier wird erst mal die SKU validiert. Beim Fehler geben wir HTTP 400 zurück. Was macht denn der Service?
shoppingCartRepo.findById(uuid) return if(optionalCart.isPresent) { val cart = optionalCart.get() val product: Product = productServiceClient.getProduct(sku) if(product != null) { cart.products?.add(ShoppingCartItem(product.sku, product, 1)) shoppingCartRepo.save(cart) } return cart } else { null } } Controller Servicelayer Und hier geben wir dann dem Warenkorb das gefundene Produkt. Was sind denn • ShoppingCart • ShoppingCartItem • Product? Hier holen wir ein Produkt beim Productservice ab. Was macht denn der Service?
amount: Int?, @OneToMany(cascade = [ALL]) var products: MutableList<ShoppingCartItem>? ) Controller Servicelayer Was sind denn • ShoppingCart • ShoppingCartItem • Product? Achso. Das sind die Entities für den OR Mapper. Die nutzen wir aber auch im Client. Shopping Cart Was macht denn der Service?
[ALL]) var product: Product?, var quantity: Int? ) Aber ShoppingCartItem kommt doch im Modell gar nicht vor? Ja, das brauchen wir aber für den ORM wegen der Quantity Shopping Cart Product 0..n 1 Was macht denn der Service?
QUANTITY <= 10 Controller Servicelayer Von einem Produkt darf man doch nur maximal 10 haben. Wo wird das denn geprüft? Na hier. In der `schema.sql` Shopping Cart Ähem… Anna? Wo war noch mal der Constraint? DB-Repository Was macht denn der Service?
syntaktische- und semantische Validierung zusammengesetzter Fachtyp << Aggregate >> ShoppingCart Quantity AggregateRoot - Interface nach außen - alle Fachlogik - Invarianten - immer gültig! putProductInto amount quantityOfProduct checkMaximumProduct Count Nur diese Teile reden mit der Außenwelt! WICHTIG: Nach außen gegebene Objekte, dürfen keinen Einfluss mehr auf die Domäne haben! Kopieren! Die Domain
Fachlogik (Domain) • Die Domain hat Invarianten • Viele Umsysteme, bzw. APIs • Verschiedene fachliche Sichten • Kein Fachmodell • Keine Invarianten • simples CRUD
• Einzelne Schichten lassen sich besser testen. • Einführung eines neuen Umsystems ist einfacher. • Neue Kollegen sehen sich den Kern an und wissen, was passiert. Die Wahrheit steht im Code. Diesmal wirklich. ;-) • Overhead - Domainobjekte müssen oft in neue Modelle umgewandelt werden. • Manche Frameworks machen einem ein Strich durch die Rechnung. Aufwand von Sonderlocken hier: Hibernate und Jackson