¿ªÔ´¿ò¼ÜJdon¼Ü¹¹Ñо¿ ÏÂÔØ±¾ÎÄ

JdonFramework¼Ü¹¹

JdonFrameworkÊÇÒ»¸öDDDÁìÓòÇý¶¯Éè¼Æ¿ò¼Ü£¬Domain Model + In-memory + Events£¬³£×¤ÄÚ´æIn-memoryµÄÁìÓòÄ£ÐÍDomain Modelͨ¹ýÁìÓòʼþDomain EventsÇý¶¯¼¼ÊõʵÏÖ¸÷ÖÖ¹¦ÄÜ£¬ÕýÈç»ùÒòDNAÊÇÉúÃü¸÷Öֻ¹¦ÄܵĺËÐÄÒ»Ñù£¬ÊµÏÖÁËÒÔÁìÓòÄ£ÐͶø²»ÊÇÊý¾Ý±íΪºËÐĵÄеÄÄ£ÐÍÇý¶¯¿ª·¢¼Ü¹¹MDD¡£

ûÓÐÁìÓòÉè¼ÆµÄ»µÉè¼Æ

ÒÔ¶©µ¥ÎªÀý×Ó£¬Èç¹û²»²ÉÈ¡DDDÉè¼Æ£¬¶øÊÇͨ³£ÆÓËØµÄÊý¾Ý±í¿âÉè¼Æ£¬½«¶©µ¥Éè¼ÆÎª¶©µ¥Êý¾Ý±í£¬ÄÇô´øÀ´µÄÎÊÌâÊÇ£º

½«ÊµÌåµÄÖ°Ôð·ÖÀëµ½²»Í¬ÏÞ¶¨³¡¾°£¬±ÈÈç¶©µ¥ÖÐÓÐOrderItemId, OrderId, ProductId ºÍ Qty£¬ÕâÊǺϺõÂß¼­µÄ×î³õ¶©µ¥£¬ºóÀ´ÓÐ MinDeliveryQty ºÍ PendingQty×ֶΣ¬ÊǺͶ©µ¥½»»õÓйأ¬ÕâÆäʵÊÇÁ½¸ö¸ÅÄ¶©µ¥ºÍ¶©µ¥µÄ½»»õ£¬µ«ÊÇÎÒÃǰÑÕâЩ×ֶζ¼»ìºÏÔÚÒ»¸öÀàÖÐÁË¡£

»ìÏýÔÚÒ»ÆðµÄÎÊÌâ¾ÍÊǽ«À´ÄÑÒÔÓ¦¸¶±ä»¯£¬ÒòΪʵÌåµÄÖ°ÔðÊǸ÷×Ա仯µÄ¡£ ÁìÓò²»ÊǰÑʵÌå¿´³ÉÌú°åÒ»¿é£¬Ò»¿ªÊ¼¾Í°ÑËü·Ö½âµ½¸÷ÖÖ³¡¾°¡£Ï¶©µ¥ºÍ¶©µ¥½»»õ½»¸¶ÊÇÁ½¸ö³¡¾°£¬ËüÃÇÓ¦¸ÃÓб˴˶ÀÁ¢µÄ½Ó¿Ú£¬ÓÉʵÌåÀ´ÊµÏÖ¡£Õâ¾ÍÄܹ»ÈÃʵÌåºÍºÜ¶à³¡¾°´ò½»µÀ£¬¶ø±Ë´Ë²»Ó°Ï죬Õâ¾ÍÊÇ×éºÏÄ£ÐÍcomposite modelµÄÒ»¸ö¹Ø¼üÓŵ㡣

ÔÚÊý¾Ý¿âÖÐËüÃÇÊÇÒ»¸ö£¬Ò²¾ÍÊÇ˵£¬´ÓERÄ£ÐÍÉÏ¿´£¬ËüÃÇÊÇÒ»¸öÕûÌ壬µ«ÊÇ´Ódomain modelÁìÓòÄ£ÐͽǶȿ´£¬ËüÃÇÊÇ·ÖÀëµÄ¡£

ÏÂͼÊÇ»ùÓÚJdon¿ò¼Ü¿ª·¢µÄJiveJdonÖÐÁìÓòÄ£ÐÍ£¬ÖмäµÄÁìÓòÄ£ÐÍ¿ÉÄÜÊǼ̳еȹØÏµ×é³ÉµÄ¶ÔÏóȺ£¬»òÕß³ÉΪ¾ÛºÏȺAggregation£¬µ«ÊǶÔÓ¦µÄÊý¾Ý±í¿ÉÄÜÊÇÒ»ÕÅ±í£¬Óɴ˿ɼû£¬ÁìÓòÄ£ÐÍÄܹ»¸ü׼ȷ·´Ó³ÒµÎñÐèÇó¡£

ÁìÓòÇý¶¯Éè¼ÆDDD

µ±ÎÒÃǽӵ½Ò»¸öÐÂÏîĿʱ£¬Ê¹ÓÃUML¹¤¾ß£¬Í¨¹ýÃæÏò¶ÔÏóDDDµÄ·ÖÎöÉè¼Æ·½·¨½«Æä±ä³ÉÁìÓòÄ£ÐÍͼ£¬ÈçÏ£º

ÕâÊÇÒ»¸öµäÐ͵ÄDDD½¨Ä£Í¼£¬Õâ¸öÄ£ÐÍͼ¿ÉÒÔÖ±½ÓºÍJava´úÂë¶ÔÓ¦£¬±ÈÈçÆäÖÐCargoÄ£Ð͵ĴúÂëÈçÏ£¬Á½ÕßÊÇÍêȫһһ¶ÔÓ¦£¬¿ÉÒÔʹÓÃtogetherµÈ½¨Ä£¹¤¾ßÖ±½Óת»»£¬Jdon¿ò¼ÜµÄ@Model¾ÍÊÇÕë¶ÔCargoÕâÑùÄ£ÐÍ£¬½«ÆäÔËÐÐÔÚJavaƽ̨ÖУ¬£º

package ship; @Model

public class Cargo { private String id;

private ship.DeliveryHistory lnkDeliveryHistory; private ship.DeliverySpec lnkDeliverySpec;

public Cargo(String trackingId, DeliverySpec deliverySpec) { this.id = trackingId; this.lnkDeliverySpec = deliverySpec; }

public void changeDestination(final Location newDestination) { lnkDeliverySpec.setDestination(newDestination); }

//¸ú×Ù»õÎïλÖÃ

public Location lastKnownLocation() { final HandlingEvent lastEvent = this.getLnkDeliveryHistory().lastEvent(); if (lastEvent != null) { return lastEvent.getLocation(); } else { return null; } }

//µ±»õÎïÔÚÔËÊäµÖ´ïÄ¿µÄµØµãʱ public boolean hasArrived() { return lnkDeliverySpec.getDestination().equals(lastKnownLocation()); }

//¸ú×ٹ˿ͻõÎïµÄ¹Ø¼üװжʼþ public boolean isUnloadedAtDestination() { for (HandlingEvent event : this.getLnkDeliveryHistory().eventsOrderedByCompletionTime()) { if (HandlingEvent.Type.UNLOAD.equals(event.getType()) &&hasArrived()) { return true; } } return false; }

¡­¡­ }

µ±ÁìÓòÄ£ÐÍCargo³öÀ´ÒÔºó£¬ÏÂÒ»²½¾ÍÊÇʹÓÃJdon¿ò¼ÜÀ´½«ÆäÔËÐÐÆðÀ´£¬ÒòΪJdon¿ò¼Ü·ÖΪÁìÓòÄ£ÐͺÍ×é¼þ¼¼ÊõµÈÁ½¸ö²¿·Ö£¬CargoÎÞÒÉÊôÓÚ@ModelÄ£Ðͼܹ¹£¬ÎÒÃÇÖ»Òª¸øÄ£ÐͼÓÉÏ@Model£¬¾ÍÄÜÈÃCargoµÄ¶ÔÏóÉú»îÔÚÄڴ滺´æÖС£

@Model

public class Cargo { }

ÃæÏòDDDµÄʼþÇý¶¯¼Ü¹¹

ΪÁ˸üºÃµØÍ»³öÓ¦ÓÃÐèÇóΪÖ÷£¬Jdon¿ò¼Ü²ÉÈ¡ÃæÏòDDDµÄÖ÷ÒªÉè¼ÆË¼Ï룬Ö÷ÒªÌØµãÊdz£×¤ÄÚ´æin-memoryµÄÁìÓòÄ£ÐÍÏò¼¼Êõ¼Ü¹¹·¢ËÍʼþÏûÏ¢£¬Çý¶¯¼¼Êõ¼Ü¹¹ÎªÖ®·þÎñ£¬ÈçͬÈËÌåµÄDNSÊÇÈËÌå¸÷ÖֻµÄÖ÷Òª¿ØÖÆÕߺÍ×î¸ß˾ÁÁìÓòÄ£ÐÍÊÇÒ»¸öÈí¼þϵͳµÄ×î¸ß˾Áî¡£

JFÓÐÎåÖÖÄ£ÐÍ×é¼þ£¬ÈçÏ£º

Ò». ʵÌå¾ÛºÏ¸ù¶ÔÏóԪעÊÍ @Model; ¶þ. ·þÎñService ԪעÊÍ @Service; Èý. ÆÕͨÀà×é¼þ¹¹¼þ @Component;

ËÄ. Éú²úÕßProdcuer-Ïû·ÑÕßÄ£ÐÍ @send @Consumer; Îå. À¹½ØÆ÷ @ Interceptor, Ê×ÏÈÐèÒªµ¼Èëµã @Introduce; ËùÓж¼ÔÚ com.jdon.annotation.*°üÖС£

ÕâЩģÐÍ×é¼þÆäʵÓл®·ÖΪÁ½´óÀࣺҵÎñºÍ¼¼Êõ£º

³£×¤ÄÚ´æ@Model ÁìÓòÄ£ÐÍ£¬°üÀ¨ÊµÌåÄ£ÐÍÖµ¶ÔÏóºÍÁìÓò·þÎñ£¬Óë¼¼Êõ¼Ü¹¹Î޹ء£Ï൱ÓÚÓ㣻Éú´æ¿Õ¼äÊÇ»º³åÆ÷ÖÐ

@Component ¼¼Êõ×é¼þ¼Ü¹¹£¬ÓÃÒÔÖ§³ÅÁìÓòÄ£ÐÍÔÚ¼ÆËã»úϵͳÔËÐеÄÖ§³Å»·¾³£¬Ï൱ÓÚÓãÉú»îµÄË®¡£¿Õ¼äÔÚContext container,ÀýÈçServletContextÖС£

Á½ÕßÒÔDomain Eventsģʽ½»»¥·½Ê½:ÁìÓòÄ£ÐÍÏò¼¼Êõ×é¼þ·¢³öÒì²½ÃüÁî¡£

ʵÌåÄ£ÐÍ

¸ù¾ÝDDD·½·¨£¬ÐèÇóÄ£ÐÍ·ÖΪʵÌåÄ£ÐÍÖµ¶ÔÏóºÍÁìÓò·þÎñÈýÖÖ£¬Êµ¼ÊÐèÇó¾­³£±»»®·ÖΪ²»Í¬µÄ¶ÔÏóȺ£¬ÈçCargo¶ÔÏóȺ¾ÍÊÇCargoΪ¸ù¶ÔÏ󣬺óÃæ¾ÛºÏÁËÒ»ÅúÓëÆäÁªÏµ·Ç³£½ôÃܵÄ×Ó¶ÔÏóÈçÖµ¶ÔÏóµÈ£¬ÀýÈç½Î³µÎª¸ù¶ÔÏ󣬶øÂí´ïÔòÊǽγµÕâ¸ö¶ÔÏóȺÖеÄÒ»¸öʵÌå×Ó¶ÔÏó¡£

ÔÚJdon¿ò¼ÜÖУ¬ÊµÌå¸ùÄ£ÐÍͨ³£ÒÔ@Model±êʶ£¬²¢ÇÒÒªÇóÓÐÒ»¸öΨһµÄ±êʶÖ÷¼ü£¬Äã¿ÉÒÔ¿´³ÉºÍÊý¾Ý±íµÄÖ÷¼üÀàËÆ£¬ËüÊÇÓÃÀ´±êʶÕâ¸öʵÌåÄ£ÐÍΪΨһµÄ±êÖ¾£¬Ò²¿ÉÒÔʹÓÃJava¶ÔÏóµÄHashCodeÀ´±êʶ¡£

Jdon¿ò¼ÜÊÇʵÌåÄ£Ð͵ÄÖ÷¼ü±êʶÓÐÁ½¸öÓô¦£º

Ê×ÏÈÊÇÓÃÀ´»º´æÊµÌåÄ£ÐÍ£¬Ä¿Ç°»º³åÆ÷ÊÇʹÓÃEHcache£¬¿ÉÒÔÎÞ·ìÕûºÏ·Ö²¼Ê½ÔÆ»º´æTerracottaÀ´½øÐÐÉìËõÐÔÉè¼Æ¡£

Ö»Òª±êʶ@ModelµÄʵÌ壬ÔÚ±íÏÖ²ãJspÒ³ÃæÔÙ´ÎʹÓÃʱ£¬½«×Ô¶¯Ö±½Ó´Ó»º´æÖлñµÃ£¬ÒòΪÔÚÖмäÒµÎñ²ãºÍ±íÏÖ²ãÖ®¼äJdon¿ò¼Ü´æÔÚÒ»¸ö»º´æÀ¹½ØÆ÷CacheInterceptor£¬¼û¿ò¼ÜµÄaspect.xmlÖÐÅäÖá£

ΪÁËÄܹ»ÔÚÒµÎñ²ãÄܹ»Ê¹Óûº´æÖеÄÄ£ÐÍ£¬ÐèÒªÔÚÒµÎñ²ãºóÃæµÄ³Ö¾Ã²ã»òRepositoryÖÐÊÖ¹¤¼ÓÈ뻺´æµÄAnnotation±êÇ©£¬ÈçÏ£º