Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÁìÓòÇý¶¯Éè¼ÆÖÐÃæÏò¾­µä·Ö²ã¼Ü¹¹µÄÁìÓòʼþµÄÉè¼ÆÓëʵÏÖ
 
À´Ô´£ºwww.cnblogs.com ·¢²¼ÓÚ£º 2017-9-20
  2153  次浏览      27
 

ÔÚÎÒ¿ª·¢µÄ¡¶Byteart Retail¡·°¸ÀýÖУ¬ÒѾ­ÒýÈëÁËÁìÓòʼþ£¨Domain Events£©µÄʵÏÖ²¿·Ö£¬ÏêÇéÇë¼û֮ǰÎÒдµÄһƪÎÄÕ£º¡¶Éî¶ÈÆÊÎöByteart Retail°¸Àý£ºÁìÓòʼþ£¨Domain Events£©¡·¡£¾­¹ýÒ»¶Îʱ¼äµÄѧϰºÍ˼¿¼£¬¶ÔÓÚÁìÓòʼþµÄÉè¼ÆÓëʵÏÖÒ²ÓÐÁËеÄÈÏʶ¡£ÔÚ±¾ÎÄÖУ¬Ê×ÏÈÈÃÎÒÃÇÒ»ÆðÁ˽âÒ»ÏÂByteart Retail°¸ÀýÖÐÁìÓòʼþµÄʵÏÖÓÐÄÄЩ±×¶Ë£¬È»ºóÔÙ¶ÔÁìÓòÇý¶¯Éè¼ÆÖÐÁìÓòʼþµÄÉè¼ÆÓëʵÏÖ½øÐÐÌÖÂÛ¡£ÓÉÓÚÎÄÖÐÓв»Éٵط½¶¼Êdzö×ÔByteart Retail°¸Àý£¬Òò´Ë£¬±¾ÎÄÈÔÈ»¿ÉÒÔ¿´³ÉÊÇ¡¶Éî¶ÈÆÊÎöByteart Retail°¸Àý¡·µÄ¡°Íâ´«¡±¡£ÔÚдÕâÆªÎÄÕÂʱ£¬ÎÒÒѾ­Öع¹ÁËByteart RetailÖÐÁìÓòʼþµÄʵÏÖ£¬Òò´Ë£¬¶ÁÕßÅóÓÑÈÔÈ»¿ÉÒÔ´ÓGitHub»ñÈ¡°¸ÀýµÄ×îдúÂë½øÐÐÔĶÁ¡£

»Ø¹ËByteart Retail°¸ÀýÖÐÁìÓòʼþµÄʵÏÖ

ÔÚ¡¶Éî¶ÈÆÊÎöByteart Retail°¸Àý£ºÁìÓòʼþ£¨Domain Events£©¡·Ò»ÎÄÖУ¬ÎÒÒѾ­Ïêϸ½éÉÜÁËÁìÓòʼþµÄʵÏÖ·½Ê½£¬Òò´Ë£¬ÔÚÕâÀïÒ²²»´òËãÔÙ×÷¸üΪÏêϸµÄ˵Ã÷£¬ÓÈÆäÊÇÁìÓòʼþµÄ¶¨Ò岿·Ö¡£Ê×ÏÈÐèҪ˵Ã÷µÄÊÇ£¬±¾ÎÄËùÃèÊöµÄÄÚÈÝ»òÐí¸úÕâÆªÎÄÕµÄÄÚÈÝÓÐЩ³öÈ룬µ«Õâ¶¼²»Òª½ô£¬Ã»ÓÐÔĶÁ¹ýÕâÆªÎÄÕµÄÅóÓÑ£¬Ò²¿ÉÒԻعËÐԵؿ´Ò»Ï£¬Á˽âÒ»ÏÂÎÊÌâµÄ±³¾°Çé¿ö£¬Õâ¶ÔÓÚ¸üÉîÈëµØÁ˽ⱾÎĵÄÖ÷Ҫ˼Ï뻹ÊÇÓкܴó°ïÖúµÄ¡£

ÎÊÌâÀ´Ô´ÓÚÕâÆªÎÄÕÂÖС°»¹ÓÐʲôÎÊÌâÂ𣿡±ÕâÒ»½ÚµÄÃèÊö¡£ÔÚÕâÒ»½ÚÖУ¬ÒýÈëÁËÒ»¸ö·¢Ë͵ç×ÓÓʼþµÄÓ¦Óó¡¾°£¬¶ÔÓÚ·¢Ë͵ç×ÓÓʼþµÄ´¦Àí£¬ÎÄÖн¨ÒéʹÓÃÇø±ðÓÚÁìÓòʼþµÄÁíÒ»ÖÖʼþÀàÐÍ£ºÓ¦ÓÃʼþ£¨Application Events£©£¬ÒÔÔÚÁìÓò¶ÔÏóÍê³É³Ö¾Ã»¯²Ù×÷µÄͬʱ£¬Ïòʼþ×ÜÏߣ¨Event Bus£©ÅÉ·¢Ò»¸öÓ¦ÓÃʼþ£¬´Ó¶øÔÚÓ¦ÓÃʼþ´¦ÀíÆ÷ÖÐÍê³Éµç×ÓÓʼþµÄ·¢ËÍÈÎÎñ¡£µ±È»£¬ÎÒÃÇÓöµ½µÄÎÊÌâÊÇÒ»ÖµģºÎÒÃÇÏ£Íû¶ÔÏó³Ö¾Ã»¯ºÍ·¢Ë͵ç×ÓÓʼþ¶¼ÔÚͬһ¸öÊÂÎñÖÐÍê³É£¬È·±£¶ÔÏó³Ö¾Ã»¯ºÍµç×ÓÓʼþ·¢ËÍÄܹ»Í¬Ê±³É¹¦»òÕßͬʱʧ°Ü¡£

È»¶ø£¬ÊÂʵÉÏÕâ¸öÓ¦ÓÃʼþµÄÒýÈëºÍʵÏÖ²¢²»ÊǷdz£ºÏÀíµÄ£¬ËüÐèÒª¾ÛºÏ¸ùÔÚÁìÓòʼþ·¢Éúʱ£¬½«ÕâЩÒÑ·¢ÉúµÄʼþ¼Ç¼ÏÂÀ´£¬È»ºóÔÚ²Ö´¢Íê³É¶ÔÏó³Ö¾Ã»¯ÊÂÎñÌá½»µÄͬʱ£¬½«ÕâЩÁìÓòʼþת»»ÎªÓ¦ÓÃʼþ£¬ÔÙÅÉ·¢µ½Ê¼þ×ÜÏß¡£ÕâÀïÓÐÁ½¸ö·½ÃæµÄÎÊÌ⣺Ê×ÏÈ£¬¾ÍÊÇÎ¥±³ÁËÃæÏò¶ÔÏóÉè¼ÆµÄ¡°µ¥Ò»Ö°ÔðÔ­Ôò£¨Single Responsibility Principal£©¡±£¬²Ö´¢µÄÖ°ÔðÊǸºÔð¶ÔÏóÉúÃüÖÜÆÚµÄ¹ÜÀí£¬µ«½«Ê¼þÌá½»µ½Ê¼þ×ÜÏߣ¬²¢·ÇÆäÖ°Ôð·¶Î§Ö®ÄÚ£¬ÕâÑù×öÒ²»á¶Ô²Ö´¢µÄÉè¼Æ´øÀ´Ò»¶¨µÄÓ°Ï죺²Ö´¢²»µÃ²»ÒÀÀµÓÚʼþ×ÜÏß¶ø´æÔÚ£¬¼´Ê¹²ÉÓÃÁËÒÀÀµ×¢È룬Ҳ²»µÃ²»Èòִ¢¸ÐÖªµ½Ê¼þ×ÜÏߵĴæÔÚ£»ÔÚÕâÀÇëÇø±ðÒ»ÏÂCQRS¼Ü¹¹ÖÐÁìÓò²Ö´¢µÄÉè¼Æ£¬ÐèҪעÒâµÄÊÇ£¬ÔÚCQRS¼Ü¹¹ÖУ¬ÁìÓò²Ö´¢¸ºÔð³Ö¾Ã»¯Ëù·¢ÉúµÄÁìÓòʼþµ½Ê¼þ´æ´¢£¨Event Store£©£¬Í¬Ê±»¹¸ºÔð½«Ê¼þÅÉ·¢µ½Ê¼þ×ÜÏߣ¬µ«¶ÔÓÚʼþµÄ´æ´¢ºÍÅÉ·¢±¾Éí¾ÍÊÇÁìÓò²Ö´¢µÄÖ°Ôð£¬ÒòΪÁìÓò²Ö´¢ÒѾ­ÍË»¯µ½²»ÔÙÖ±½Ó¸ºÔðÁìÓò¶ÔÏóµÄ³Ö¾Ã»¯ÈÎÎñÁË£¬Òò´ËÔÚCQRSÖв¢²»´æÔÚÕâÑùµÄÎÊÌ⣻µÚ¶þ¸öÎÊÌ⣬¾ÍÊÇÈþۺϸùÀ´¸ºÔð±£´æÁìÓò¶ÔÏó£¬Õâ¶ÔÓÚÃæÏòÁìÓòÇý¶¯·Ö²ã¼Ü¹¹µÄÓ¦ÓóÌÐòÀ´Ëµ£¬²»½ö¶à´ËÒ»¾Ù£¨¶ÔÏó״̬ÒѾ­±£´æÔÚÁË˽ÓÐ×Ö¶ÎÖУ©£¬¶øÇÒ¿çÏ̵߳IJÙ×÷»¹»á´øÀ´Êý¾Ý²»Ò»ÖÂÐÔµÄÎÊÌ⣬¼´Ê¹²ÉÓÃÁ˼ÓËø»úÖÆ£¬Ò²»á¶ÔÐÔÄÜÔì³ÉÒ»¶¨µÄÓ°Ï죬ͬÑùÇø±ðÒ»ÏÂCQRS¼Ü¹¹£¬ÔÚCQRSÖУ¬¶ÔÏóµÄ״̬ÓÉʼþËÝÔ´À´ÃèÊö£¬Òò´Ë¾ÛºÏ¸ù±ØÐëά»¤ÏÖÓеÄʼþºÍʼþ¿ìÕÕ¡£

¿´À´£¬ÎÒÃÇÕæµÄÐèÒª¶ÔByteart Retail°¸Àý½øÐÐÖØ¹¹ÁË£¬Öع¹µÄÄ¿µÄ¾ÍÊÇ£ºÔÚ²»ÒýÈë¡°Ó¦ÓÃʼþ¡±µÄÇé¿öÏ£¬Ö±½ÓÔÚÁìÓòʼþ´¦ÀíÆ÷ÖÐÍê³ÉÎÒÃÇËùÐèÒªµÄ¹¦ÄÜ¡£ÕâÑùÒ²¸ü·ûºÏ¡°ÁìÓòʼþ¡±Ô­±¾µÄ¸ÅÄîºÍ¶¨Òå¡£

ÖØÐÂÉè¼ÆÁìÓòʼþ

¶ÔÓÚÁìÓòʼþµÄ½Ó¿Ú¶¨ÒåºÍ³éÏóÀàÐ͵ÄʵÏÖ£¬ÔÚ¡¶Éî¶ÈÆÊÎöByteart Retail°¸Àý£ºÁìÓòʼþ£¨Domain Events£©¡·Ò»ÎÄÖÐÎÒÒѾ­½éÉܹýÁË£¬¾Í²»¶à×÷˵Ã÷ÁË¡£ÔÚÕâÀïÎÒÃÇÖØµãÁ˽âÒ»ÏÂÁìÓòʼþµÄÅÉ·¢ºÍ´¦ÀíÂß¼­¡£

Ê×ÏÈ£¬ÁìÓòʼþÓÉÁìÓòʼþ´¦ÀíÆ÷£¨Domain Event Handler£©Íê³É´¦Àí£¬ÁìÓòʼþ´¦ÀíÆ÷ÊÇʼþ´¦ÀíÆ÷µÄÒ»ÖÖ£¨Ó¦ÓóÌÐòÖеÄʼþÀàÐͲ»Ö»ÊÇÁìÓòʼþÒ»ÖÖ£©£¬Ëù²»Í¬µÄÊÇ£¬ËüÖ»¸ºÔð´¦ÀíÁìÓòʼþ£¬Òò´Ë£¬Æä½Ó¿Ú¶¨ÒåÈçÏ£º

public interface IDomainEventHandler<TDomainEvent> : IEventHandler<TDomainEvent>
where TDomainEvent : class, IDomainEvent { }

Æä´Î£¬ÊµÏÖÕâ¸ö½Ó¿Ú£¬ÔÚʵÏÖÀàÖÐÍê³Éʼþ´¦Àí£º

public class OrderDispatchedEventHandler : IDomainEventHandler<OrderDispatchedEvent>
{
public void Handle(OrderDispatchedEvent evnt)
{
// ´¦Àíʼþ
}
}

È»ºó£¬ÐÞ¸ÄDomainEventÀ࣬ÔÚ¸ÃÀàÖÐÔö¼ÓÁËPublish¾²Ì¬·½·¨£¬ÓÃÀ´ÅÉ·¢ÁìÓòʼþ£º

public static void Publish<TDomainEvent>(TDomainEvent domainEvent)
where TDomainEvent : class, IDomainEvent
{
IEnumerable<IDomainEventHandler<TDomainEvent>> handlers = ServiceLocator
.Instance
.ResolveAll<IDomainEventHandler<TDomainEvent>>();
foreach (var handler in handlers)
{
if (handler.GetType().IsDefined (typeof(HandlesAsynchronouslyAttribute), false))
Task.Factory.StartNew(() => handler.Handle(domainEvent));
else
handler.Handle(domainEvent);
}
}

OK£¬ÁìÓòʼþµÄÅÉ·¢ºÍ´¦ÀíÒѾ­Íê³ÉÁË£¬¾ÍÕâô¼òµ¥£¡ÔÚ´ËÐèҪ˵Ã÷¼¸µã£º1¡¢ÒýÈëÁËHandlesAsynchronouslyÌØÐÔ£¬ÔÚÁìÓòʼþ´¦ÀíÆ÷ÉÏÓ¦ÓÃÕâ¸öÌØÐÔ£¬¾ÍÄÜʹµÃ¸Ã´¦ÀíÆ÷Äܹ»»ùÓÚTPLÒÔÒì²½·½Ê½´¦Àíʼþ£¬ÓÚÊÇ£¬´¦ÀíÆ÷¿ÉÒÔ¸ù¾Ýʵ¼ÊÇé¿öÀ´Ñ¡Ôñ×Ô¼ºµÄ´¦Àíģʽ£ºÄ³Ð©´¦Àí¹ý³Ì¿ÉÄÜÐèÒª»¨·Ñ½Ï³¤µÄʱ¼ä£¬²¢ÇÒÒµÎñÂß¼­µÄ¼ÌÐøÖ´Ðв¢²»ÐèÒªµÃÖªÆä´¦Àí½á¹û£¬ÄÇô¾Í¿ÉÒÔÔÚÕâ¸öʼþ´¦ÀíÆ÷Ó¦ÓÃÕâ¸öÌØÐÔ£¬ÀýÈ磺ÔÚʼþ·¢Éúʱ·¢Ë͵ç×ÓÓʼþ£»2¡¢ÔÚPublish·½·¨ÖУ¬Ê¹Ó÷þÎñ¶¨Î»Æ÷£¨Service Locator£©À´½âÎöËùÓÐÒÑ×¢²áµÄÕë¶ÔijÖÖÁìÓòʼþµÄʼþ´¦ÀíÆ÷£¬½ø¶øÖð¸öµ÷ÓÃÒÔÍê³Éʼþ´¦Àí¡£¶Ô¡°¿ØÖÆ·´×ª/ÒÀÀµ×¢È롱ÓÐÉîÈëÑо¿µÄ¶ÁÕßÅóÓѿ϶¨»á²»ÈÏͬÕâ¸ö×ö·¨£¬ÔÚÓ¦ÓóÌÐòÖÐÖ±½ÓʹÓÃService LocatorÊDz»¿ÉÈ¡µÄ£¬Service LocatorÖ»ÄÜÓÃÔÚÏòIoCÈÝÆ÷½øÐÐÀàÐÍ×¢²áµÄʱºò£¬²»ÄÜÖ±½ÓʹÓÃService LocatorÀ´½âÎöij¸öÀàÐ͵ĶÔÏó¡£ÕâÖÖ·´¶ÔÊǺÜÓеÀÀíµÄ£¬ÒòΪÈç¹ûÔÚ³ÌÐòÖÐËæ´¦Ê¹ÓÃService LocatorµÄResolve·½·¨£¬ÄÇô³ÌÐò¶ÔÍⲿ×é¼þµÄÒÀÀµ¹ØÏµ¾Í²»Ã÷ÏÔÁË£¬¸üÔã¸âµÄÊÇ£ºÈç¹ûÎÒûÓÐÔÚIoCÈÝÆ÷ÖÐ×¢²áÀàÐÍ£¬ÄÇôÕâ¸ö³ÌÐò¾Í¸ù±¾Ã»·¨ÔËÐС£ËùÒÔ£¬Ö±½ÓʹÓÃServiceLocator.Resolve·½·¨£¬²»½ö»áÔö¼Ó³ÌÐò¶ÔÍⲿ×é¼þµÄÒÀÀµ£¬¶øÇÒ»¹»áÈÃÕâÖÖÒÀÀµÌåÏֵøü²»Ã÷ÏÔ£¬ÕâÊÇÒ»Öַdz£Ôã¸âµÄÉè¼Æ¡£

ÔÚÕâÀÎÒÏë¶ÔÕâ¸öµÚ2µã̸̸×Ô¼ºµÄ¿´·¨¡£ËäÈ»ÀíÂÛÉϽ²£¬Õâ¸öÉè¼Æ·Ç³£Ôã¸â£¬µ«ÊǶÔÓÚÎÒÃÇĿǰµÄÓ¦Óó¡¾°£¬Ö»ÓÐÕâÑùÉè¼Æ²ÅÊÇ×î¼ò½àµÄ£¬ÒòΪÇë×¢Ò⣺Ê×ÏÈ£ºPublishÊÇÒ»¸ö¾²Ì¬·½·¨£¬ÔÚ³ÌÐòÖÐÄã¸ù±¾ÎÞ·¨ÔÚ¾²Ì¬ÀàÐÍ»òÕß¾²Ì¬·½·¨µÄ»ù´¡ÉÏÓ¦ÓÃÒÀÀµ×¢È룬¼´Ê¹Äã²»Ö±½ÓʹÓÃService Locator£¬¶øÊÇʹÓÃÀàËÆÊ¼þ¾ÛºÏÆ÷£¨Event Aggregator£©µÄÉè¼Æ£¬ÄãÒ²µÃÏë°ì·¨½«Õâ¸öEvent AggregatorµÄʵÀý¡°×¢É䡱µ½Publish·½·¨ÖУ¬µ«Õâ¶ÔÓÚ¾²Ì¬·½·¨ÓÖÏÔµÃÎÞÄÜΪÁ¦¡£»òÐíÄ㻹»á¾õµÃ£¬ÎÒÃÇÊÇ·ñ¿ÉÒÔͨ¹ýDomainEventµÄ¹¹Ô캯Êý½«ÕâÖÖÒÀÀµ×¢Éä½øÀ´£¿´ð°¸µ±È»ÊÇ·ñ¶¨µÄ£ºDomainEventÊÇÒ»ÖÖÏûÏ¢£¬ËüÖ»²»¹ýÊÇÊý¾ÝµÄÔØÌ壬Ëü¸ù±¾¾Í²»Ó¦¸Ã¹ØÐÄ×Ô¼ºÊÇͨ¹ýʲô·½Ê½ÅÉ·¢³öÈ¥µÄ£¬ÕâÑù×öÖ»ÄܼÓÇ¿DomainEventÓëʼþÅÉ·¢»úÖÆµÄñîºÏ£¬ÉõÖÁ»á½«ÕâÖÖñîºÏ´øµ½ÁìÓòÄ£Ð͵±ÖУ¡È¨ºâServiceLocator.ResolveËù´øÀ´µÄ±×¶Ë£¬ÕâÖÖÉè¼Æ¸ü¼ÓÔã¸â£¬ÉõÖÁ¿ÉÒÔ˵ÊǿֲÀ£¡Æä´Î£¬Ö®ËùÒÔ½«Publish¶¨ÒåΪ¾²Ì¬·½·¨£¬¾ÍÊÇÒòΪÁìÓòʼþ·¢×ÔÁìÓòÄ£ÐÍ£¬ÎÒÃǸù±¾ÎÞ·¨Ò²²»Äܽ«Ê¼þÅÉ·¢»úÖÆµÄʵÀý×¢Éäµ½ÁìÓòÄ£ÐÍÖУ¬Òò´Ë£¬ÁìÓò¶ÔÏóÊÇÎÞ·¨µÃµ½ÈκÎÅÉ·¢»úÖÆµÄʵÀý£¬½ø¶ø·¢ÆðÁìÓòʼþµÄ£¬ËüÖ»ÄÜͨ¹ýÀàËÆÏÂÃæµÄ·½Ê½½«ÁìÓòʼþÅÉ·¢³öÈ¥£º

public void Confirm()
{
DomainEvent.Publish<OrderConfirmedEvent>(new OrderConfirmedEvent(this)
{
ConfirmedDate = DateTime.Now,
OrderID = this.ID,
UserEmailAddress = this.User.Email
});
}

ÁíÍ⣬ÔÚÕâÀïÖ±½ÓʹÓÃServiceLocator.ResolveAll»¹ÓÐÒ»¸öºÃ´¦£¬¾ÍÊÇËùÓеÄʼþ´¦ÀíÆ÷¶¼¿ÉÒÔÖ±½Ó×¢²á³ÉPerResolveµÄÉúÃüÖÜÆÚ£¬Ö»ÒªÆäËùʹÓõÄÍⲿ×é¼þ£¨±ÈÈç²Ö´¢¡¢Ê¼þ×ÜÏߵȣ©Ê¹ÓÃÁ˺ÏÀíµÄÉúÃüÖÜÆÚ¹ÜÀíÆ÷£¬¾ÍÄÜÔÚʼþ´¦ÀíÆ÷ÖÐÖ±½ÓʹÓÃÕâЩ×é¼þµÄʵÀý£¬²¢Äܹ»±£Ö¤ÔÚij¸öÖ´ÐÐÉÏÏÂÎÄÖУ¬ÕâЩʵÀýÊÇÒ»Öµġ£ÕâÒ»µã·Ç³£ÖØÒª£¬ÔÚ±¾ÎĺóÃæµÄ²¿·Ö»áÌÖÂÛ¡£

×ÛÉÏËùÊö£¬Ö±½ÓʹÓÃService LocatorÀ´»ñÈ¡ËùÓÐʼþ´¦ÀíÆ÷ʵÀýµÄ×ö·¨£¬ÊǺÏÀíµÄ¡£ÕâÒ²¸øÎÒÃÇÌṩÁËһЩ¼Ü¹¹Éè¼ÆÉÏµÄÆôʾ£ºÈκÎÊÂÎïûÓÐÕýÈ·Óë·ñ£¬Ö»ÓкÏÀíÓë·ñ£¬¼Ü¹¹µÄ¹ý³Ì¾ÍÊÇÈ¡ÉáµÄ¹ý³Ì£¬ÕÒµ½×î·ûºÏµ±Ç°Ó¦Óó¡¾°µÄ½â¾ö·½°¸£¬¾ÍÊǼܹ¹µÄÄ¿µÄ¡£

×îºó£¬ÔÚIoCÈÝÆ÷ÖÐ×¢²áÁìÓòʼþ´¦ÀíÆ÷£¬Byteart RetailʹÓõÄÊÇUnity IoCÈÝÆ÷£¬Òò´ËÎÒ¾ÍÔÚByteartRetail.ServicesÏîÄ¿µÄweb.configÖÐдÈëÁËÏà¹ØµÄ×¢²áÐÅÏ¢£º

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<container>
<!--Domain Event Handlers-->
<register
type="ByteartRetail.Domain.Events.IDomainEventHandler`1
[[ByteartRetail.Domain.Events.OrderDispatchedEvent , ByteartRetail.Domain]],
ByteartRetail.Domain"
mapTo="ByteartRetail.Domain.Events.Handlers .OrderDispatchedEventHandler, ByteartRetail.Domain"
name="OrderDispatchedEventHandler" />
</container>
</unity>

µ½Ä¿Ç°ÎªÖ¹£¬Õû¸öÁìÓòʼþµÄ²úÉú¡¢ÅÉ·¢ºÍ´¦ÀíÂß¼­ÒѾ­±È½ÏÇåÎúÁË¡£½ÓÏÂÀ´£¬ÎÒÃÇÉîÈëÁìÓòʼþ´¦ÀíÆ÷£¬È¥Á˽âÒ»ÏÂÔÚ´¦ÀíÆ÷ÖÐÈçºÎÖ´ÐÐÓë²Ö´¢»òÕ߯äËüµÚÈý·½»ù´¡½á¹¹×é¼þÏà¹ØµÄ²Ù×÷£¬²¢±£Ö¤ÕâЩ²Ù×÷µÄÊÂÎñÐÔ¡£

ÁìÓòʼþ´¦ÀíÆ÷£¨Domain Event Handlers£©

ÓÉÓÚÁìÓòÄ£ÐÍÔÚÅÉ·¢ÁìÓòʼþʱ£¬Ê¹ÓÃÁËService LocatorÀ´»ñµÃËùÓеÄʼþ´¦ÀíÆ÷£¬Òò´Ë£¬ÎÒÃÇ¿ÉÒÔÔÚʼþ´¦ÀíÆ÷µÄ¹¹Ô캯ÊýÖÐÖ±½ÓÉùÃ÷ÎÒÃÇÐèҪʹÓõĻù´¡½á¹¹×é¼þ½Ó¿Ú£¬È»ºóÔÚHandle·½·¨Öе÷ÓÃÕâЩ×é¼þ¼´¿É¡£±ÈÈ磬¼ÙÉèÎÒÃÇÔÚ¶©µ¥ÒÑ·¢»õµÄʼþ´¦ÀíÆ÷ÖÐÐèÒªÓõ½ÏúÊÛ¶©µ¥µÄ²Ö´¢£¨Sales Order Repository£©£¬ÄÇôÎÒÃǾͿÉÒÔÕâÑù£º

public class OrderDispatchedEventHandler : IDomainEventHandler<OrderDispatchedEvent>
{
private readonly ISalesOrderRepository salesOrderRepository;

public OrderDispatchedEventHandler(ISalesOrderRepository salesOrderRepository)
{
this.salesOrderRepository = salesOrderRepository;
}

public void Handle(OrderDispatchedEvent evnt)
{
// this.salesOrderRepository.Find(xxxx);
}
}

½øÒ»²½£¬Èç¹ûÎÒÃÇ»¹ÐèÒªÔÚHandle·½·¨ÖÐʹÓÃʼþ×ÜÏߣ¬ÒÔ±ãÔÚ´¦ÀíÍêOrderDispatchedEventºó£¬½«Ê¼þÅÉ·¢µ½Ê¼þ×ÜÏߣ¬ÄÇôͬÀí£¬½«IEventBusÌí¼Óµ½OrderDispatchedEventHandler½Ó¿ÚµÄ¹¹Ô캯ÊýÖм´¿É¡£

ÔÚDDDµÄ·Ö²ã¼Ü¹¹Ó¦ÓóÌÐòÖУ¬Ó¦Óò㸺Ôð¸÷ÖÖÈÎÎñµÄЭµ÷£¬Òò´Ë£¬´ÓByteart Retail°¸ÀýÖÐÎÒÃÇÒ²¿ÉÒÔ¿´µ½£¬ÔÚÓ¦ÓòãµÄWCF·þÎñʵÏÖ´úÂëÖУ¬»á»ñÈ¡²Ö´¢¡¢Ê¼þ×ÜÏßµÄʵÀý£¬È»ºóͨ¹ý²Ö´¢»ñµÃÁìÓòÄ£ÐͶÔÏó£¬ÔÙͨ¹ýÕâЩ¶ÔÏóÍê³ÉÒµÎñ²Ù×÷£¬Õû¸öÈÎÎñ¶¼ÊÇÔÚÒ»¸öWCFµÄ²Ù×÷ÖÐÍê³É¡£¸ù¾ÝÉè¼Æ¾­Ñ飬ÎÒÃÇÓ¦¸Ã¾¡¿ÉÄܵØËõС¶ÔÏóÉúÃüÖÜÆÚ·¶Î§£¬ÒÔ¼õÉÙ³ö´íµÄ¼¸ÂÊ£¬Òò´Ë£¬ÔÚByteart Retail°¸ÀýÖУ¬²Ö´¢ÉÏÏÂÎÄ£¨Repository Context£©ºÍʼþ×ÜÏߣ¨Event Bus£©¶¼ÊÇÒÔWCF Per OperationµÄÉúÃüÖÜÆÚ×¢²áµ½Unity IoCÈÝÆ÷ÖУ¬Ò²¾ÍÊÇ£¬Ö»ÒªÊÇÔÚͬһ¸öWCF Operation ContextÏ£¬ÕâЩ¶ÔÏó¾ÍÊÇΨһµÄ¡£ÓÉÓÚÁìÓò¶ÔÏóÔÚµ÷ÓÃDomainEvent.Publish·½·¨·¢ËÍÏûϢʱ£¬Ò²´æÔÚÓÚÕâ¸öWCF Operation ContextÖУ¬ËùÒÔ£¬ÁìÓòʼþ´¦ÀíÆ÷Öвִ¢ËùʹÓõÄÉÏÏÂÎÄ£¨Repository Context£©¾Í»á¸úÓ¦ÓòãWCF·½·¨ÖÐËùʹÓõÄÉÏÏÂÎÄÒ»Ö¡£ÕâÒ»µã·Ç³£ÖØÒª£ºÒòΪÕâ¾ÍÈ·±£ÁËÁìÓòʼþ´¦ÀíÆ÷ÖжÔÁìÓò¶ÔÏóµÄ¸ü¸ÄºÍ±£´æ£¬Äܹ»ÔÚÓ¦ÓòãµÄWCF·½·¨ÖÐÒ»´ÎÌá½»£¬ÒòΪÁ½ÕßʹÓÃÁËÏàͬµÄRepository Context¡£ÏÂͼ´óÖ¿ÉÒÔ±íÊöÕâÑùÒ»¸ö¹ý³Ì£º

ÀàËÆµØ£¬ÔÚIEventBusÔÚUnity IoCÈÝÆ÷ÖÐ×¢²áΪPer WCF Operation ContextµÄÉúÃüÖÜÆÚµÄǰÌáÏ£¬ÎÒÃÇ»¹¿ÉÒÔÔÚʼþ´¦ÀíÆ÷ÖÐÒýÓÃIEventBusµÄʵÀý£¬È»ºóÔÚÓ¦ÓòãµÄ´úÂëÖÐʹÓÃIEventBus.Commit()·½·¨½«ÅÉ·¢Ê¼þÒ»´ÎÌá½»¡£OrderDispatchedEventHandlerµÄÍêÕû´úÂëÈçÏ£º

public class OrderDispatchedEventHandler : IDomainEventHandler<OrderDispatchedEvent>
{
private readonly ISalesOrderRepository salesOrderRepository;
private readonly IEventBus bus;

public OrderDispatchedEventHandler(ISalesOrderRepository salesOrderRepository, IEventBus bus)
{
this.salesOrderRepository = salesOrderRepository;
this.bus = bus;
}

public void Handle(OrderDispatchedEvent evnt)
{
SalesOrder salesOrder = evnt.Source as SalesOrder;
salesOrder.DateDispatched = evnt.DispatchedDate;
salesOrder.Status = SalesOrderStatus.Dispatched;

bus.Publish<OrderDispatchedEvent>(evnt);
}
}

// Ó¦Óò㣺
public void Dispatch(Guid orderID)
{
var salesOrder = salesOrderRepository.GetByKey(orderID);
salesOrder.Dispatch();
salesOrderRepository.Update(salesOrder);
Context.Commit();
bus.Commit();
}

ÔÚÉÏÃæÓ¦ÓòãµÄDispatch·½·¨ÖУ¬ÎÒÃÇʹÓÃContext.Commit()·½·¨ºÍbus.Commit()·½·¨À´·Ö±ð¶Ô²Ö´¢²Ù×÷ºÍʼþ×ÜÏß²Ù×÷½øÐÐÊÂÎñÌá½»¡£ÔÚĿǰµÄÕâÖÖ¶þ½×¶ÎÌá½»£¨Two Phase Commit£¬2PC£©Çé¿öÏ£¬Á½ÕßÖ®¼äÊDz»¾ß±¸ÊÂÎñÐԵġ£µ±È»£¬Ò²²»ÊÇËùÓеÄÓ¦Óó¡¾°¶¼±ØÐë±£Ö¤Á½ÕßµÄÊÂÎñÐÔ£¬±ÈÈçÎÒÃǵĵç×ÓÓʼþ·¢Ë͹¦ÄÜ£¬ÔÚÊý¾ÝÒѾ­±»Ìá½»µ½Êý¾Ý¿âÒÔºó£¬Óʼþ·¢Ëͳɹ¦Óë·ñ²¢²»»á¶Ôϵͳ±¾ÉíµÄÊý¾ÝÒ»ÖÂÐÔÔì³É¶à´óµÄÓ°Ï죬³äÆäÁ¿Ò²Ö»Êǿͻ§ÊÕ²»µ½µç×ÓÓʼþ£¬´Ëʱ¿ÉÒÔ½«Óʼþ·¢ËÍʧ°ÜµÄÔ­Òò¼Ç¼ÔÚÈÕÖ¾ÖУ¬ÔÙÓÉϵͳά»¤ÈËÔ±È˹¤½â¾ö¡£Ò²ÓÐһЩӦÓó¡ºÏ£¬Êý¾ÝÒ»ÖÂÐÔÒªÇóÒªÔ¶Ô¶´óÓÚÐÔÄÜ»òÆäËü·½ÃæµÄÒªÇ󣬴Ëʱ£¬ÎÒÃǾͱØÐë±£Ö¤Á½ÕßµÄÊÂÎñÐÔ¡£ÔÚByteart Retail°¸ÀýÖУ¬ÎÒÒýÈëÁËÊÂÎñЭµ÷Æ÷µÄ¸ÅÄî¡£

ÊÂÎñЭµ÷Æ÷£¨Transaction Coordinator£©

ÊÂÎñЭµ÷Æ÷ÓÃÓÚЭµ÷¶à¸ö×é¼þµÄÊÂÎñ²Ù×÷£¬ËüÊÇ·Ö²¼Ê½ÊÂÎñ¼Ü¹¹µÄÒ»ÖÖʵÏÖ£¬ÔÚByteart RetailÖУ¬ÌṩÁËÁ½ÖÖÊÂÎñЭµ÷Æ÷µÄʵÏÖ£ºÒ»ÖÖÊÇ»ùÓÚ΢ÈíMSDTC£¨Microsoft Distributed Transaction Coordinator£©µÄʵÏÖ£¬ÁíÒ»ÖÖÔòÊǺöÂÔÈκηֲ¼Ê½ÊÂÎñ´¦ÀíµÄʵÏÖ£¬ÒÔÏÂÊÇÓëÊÂÎñЭµ÷Æ÷Ïà¹ØµÄ½Ó¿ÚºÍÀࣺ

´ÓͼÖпɼû£¬Byteart RetailʵÏÖÁËÁ½ÖÖÀàÐ͵ÄÊÂÎñЭµ÷Æ÷£ºDistributedTransactionCoordinatorÒÔ¼°SuppressedTransactionCoordinator£¬ÓÉTransactionCoordinatorFactory¹¤³§Àà¸ù¾Ý´«ÈëµÄIUnitOfWork¶ÔÏóÀ´´´½¨ËùÐèÒªµÄÊÂÎñЭµ÷Æ÷ʵÀý¡£ÔÚIUnitOfWork½Ó¿ÚÖÐÌṩÁËÒ»¸öÊôÐÔ£ºDistributedTransactionSupported£¬±íʾµ±Ç°µÄUnit Of WorkÊÇ·ñÖ§³Ö΢ÈíµÄ·Ö²¼Ê½ÊÂÎñЭµ÷Æ÷£¨MSDTC£©£¬Òò´Ë£¬ÔÚTransactionCoordinatorFactory´´½¨ÊÂÎñЭµ÷Æ÷µÄʱºò£¬»áÂÖѯËùÓÐUnit Of Work£¬¿´ÊÇ·ñÈ«²¿¶¼Ö§³ÖMSDTC£¬Èç¹û¶¼Ö§³Ö£¬Ôò·µ»ØDistributedTransactionCoordinatorµÄʵÀý£¬·ñÔò·µ»ØSuppressedTransactionCoordinatorµÄʵÀý£¬±íʾºöÂÔ·Ö²¼Ê½ÊÂÎñ´¦ÀíµÄ¹¦ÄÜ¡£DistributedTransactionCoordinator·â×°ÁËSystem.Transactions.TransactionScopeµÄʵÏÖ£¬ÔÚCommit()·½·¨±»µ÷ÓÃʱ£¬»áÊ×Ïȵ÷ÓûùÀàÖеÄCommit()·½·¨À´¶ÔUnit Of WorkÖðÒ»Ìá½»£¬È»ºóÔÙʹÓÃTransactionScope.Complete()·½·¨Íê³É·Ö²¼Ê½ÊÂÎñ¡£Òò´Ë£¬DistributedTransactionCoordinatorµÄʹÓ㬿ÉÒÔÈ·±£ËùÓÐÖ§³ÖMSDTCµÄ»ù´¡½á¹¹×é¼þ£¨MS SQL Server¡¢Oracle¡¢MSMQµÈ£©µÄÊÂÎñÐÔ¡£

»Ø¹ËÉÏÃæÓ¦ÓòãµÄ´úÂ룬ÔÚÒýÈëÁËÊÂÎñЭµ÷Æ÷Ö®ºó£¬Dispatch·½·¨¿ÉÒÔÐ޸ijɣº

public void Dispatch(Guid orderID)
{
using (ITransactionCoordinator coordinator = TransactionCoordinatorFactory.Create(Context, bus))
{
var salesOrder = salesOrderRepository.GetByKey(orderID);
salesOrder.Dispatch();
salesOrderRepository.Update(salesOrder);
coordinator.Commit();
}
}

ÓÉÓÚÎÒÃÇÑ¡ÓõÄEntity FrameworkºÍSQL Local DB×÷ΪÊý¾Ý´æ´¢»úÖÆ£¬Òò´Ë£¬Context±¾ÉíÊÇÖ§³ÖMSDTCµÄ£¬ÖÁÓÚcoordinatorÊÇ·ñÊÇDistributedTransactionCoordinator£¬¾ÍÐèÒª¿´busÊÇ·ñÖ§³ÖMSDTC¡£ÎªÁËÑéÖ¤´Ë´¦µÄÊÂÎñЭµ÷Æ÷µÄ¹¤×÷£¬ÎÒÔÚByteart RetailÖмÓÈëÁËÁíÒ»ÖÖʼþ×ÜÏߣ¨Event Bus£©µÄʵÏÖ£º»ùÓÚMSMQµÄʼþ×ÜÏߣ¨´úÂëÇë²Î¿¼ByteartRetail.Events.Bus.MSMQBusÀࣩ£¬µ±bus.Publish±»µ÷ÓÃʱ£¬MSMQBus»á½«Ê¼þÅÉ·¢µ½MSMQÉÏ¡£¾­¹ý²âÊÔ£¬Êý¾ÝµÄ±£´æ²Ù×÷ºÍ·¢ËÍʼþµ½MSMQµÄ²Ù×÷µÄÈ·ÊÇÔÚͬһ¸öÊÂÎñÖÐÍê³ÉµÄ£¬Ôڳɹ¦Íê³ÉÕâЩ²Ù×÷ºó£¬ÎÒÃÇ¿ÉÒÔÔÚMSMQÖв鿴µ½ÕâÑùµÄÏûÏ¢ÄÚÈÝ£º

Èç¹ûÑ¡ÓõÄEvent Bus²»Ö§³ÖMSDTC£¬ÄÇôcoordinator¾Í»áÊÇSuppressedTransactionCoordinator£¬Ò²¾ÍÒâζ×ÅûÓÐÈκηֲ¼Ê½ÊÂÎñµÄ±£ÕÏ¡£ÀýÈ磬ByteartRetail.Events.Bus.EventBusÀà²ÉÓÃʼþ¾ÛºÏÆ÷£¨Event Aggregator£©À´ÊµÏÖµç×ÓÓʼþ·¢Ë͹¦ÄÜ¡£¡°µç×ÓÓʼþ·¢ËÍ¡±±¾ÉíÒ²ÊDz»Ö§³ÖMSDTCµÄ£¬ËùÒÔ£¬´Ë´¦µÄÊÂÎñÐÔÊÇÎÞ·¨µÃµ½±£Õϵġ£²»¹ý£¬ÔÚSuppressedTransactionCoordinator½øÐÐCommitµÄʱºò£¬»áÊ×ÏÈÌá½»Êý¾Ý¿âÊÂÎñ£¬Ò»µ©·¢ÉúÒì³££¬ÄÇôºóÃæ¶ÔEvent BusµÄÌá½»Ò²¾Í²»»á½øÐУ¬¶ÔÓÚ¡°µç×ÓÓʼþ·¢ËÍ¡±Õâ¸öÓ¦Óó¡¾°À´Ëµ£¬ÒѾ­¿ÉÒÔÂú×ãÁË£¨ÒòΪ²»»á³öÏÖÊý¾ÝûÓиü¸Ä£¬È´ÒѰѵç×ÓÓʼþ·¢³öµÄÞÏÞξÖÃæ£©¡£

Èç¹ûÄãÊÇÒ»¸öÇ¿ÆÈÖ¢»¼Õߣ¨ÊÂʵÉÏÎÒÒ²ÊÇ£©£¬Äã»á¾õµÃÕâÑù×öÈÔÈ»²»±£ÏÕ£ºÒòΪÓʼþ·¢ËÍʧ°ÜÁË£¬ÄǾÍûÓÐÆäËüµÄ²¹¾È´ëÊ©¿ÉÒÔÖØ·¢ÓʼþÁË¡£ÆäʵºÜ¼òµ¥£ºÄÇÄã¾ÍÓÃMSMQBus£¬Ëü¿ÉÒÔÈ·±£Ê¼þÅÉ·¢ºÍÊý¾Ý¿â³Ö¾Ã»¯Í¬Ê±Íê³É£¬µ±Ê¼þ±»ÅÉ·¢µ½MSMQºó£¬ÔÙŪ¸öºǫ́·þÎñ³ÌÐò£¬´ÓMSMQ¶ÁȡʼþÐÅÏ¢£¬È»ºó³¢ÊÔ·¢ËÍÓʼþ£¬·¢Ëͳɹ¦£¬Ôò½«Ê¼þ´ÓMSMQÖÐÒÆ³ý£¬·ñÔòµÈÏÂÒ»´ÎÂÖѯµÄʱºò£¬ÔÙ³¢ÊÔÖØ·¢¡£

×îºó†ªà¼¸¾ä£ºÊ¹ÓÃMSDTC»áÒýÆðÐÔÄÜÎÊÌ⣬ËùÒÔÔÚÊý¾ÝÒ»ÖÂÐÔÒªÇ󲻸ߵÄÇé¿öÏ£¬¾¡Á¿²»ÒªÊ¹ÓÃMSDTC£¬¾ÍÈçÎÒÃǵÄÓʼþ·¢Ëͳ¡¾°Ò»Ñù¡£Ö§³ÖMSDTCµÄ×ÊÔ´¹ÜÀíÆ÷ÖÖÀàҲʮ·ÖÓÐÏÞ£¬ËùÒÔÔÚʵ¼ÊÓ¦ÓÃÖÐÓ¦¸Ã×öºÃ¼¼ÊõÑ¡ÐÍ£¬²»ÒªÃ¤Ä¿Ï½áÂÛ£¨MSDNÓ¦¸ÃÓÐMSDTCµÄ¿ª·¢Îĵµ£¬µ«ÎÒ¹À¼ÆÒ²²»»áÓÐÈË»áÓÐÌ«¶à¾«Á¦È¥ÎªÁËÒ»¸öÏîÄ¿¸ãÕâ·½ÃæµÄ¿ª·¢£©¡£µ±È»£¬Ê¹ÓÃMSDTCÐèÒªÔÚ·þÎñÆ÷ÉÏÆô¶¯Distributed Transaction Coordinator·þÎñ£º

ÁìÓòʼþµÄÒâÒå

ʼþÇý¶¯µÄ½â¾ö·½°¸

ÁìÓòʼþΪÆóÒµ¼¶Ó¦ÓóÌÐò´øÀ´ÁËʼþÇý¶¯µÄ½â¾ö·½°¸£¬´ó´ó¼õÉÙÁËÓ¦ÓóÌÐò×é¼þÖ®¼ä¡¢Ó¦ÓóÌÐòÖ®¼äµÄÒÀÀµ¹ØÏµ£ºµ±Ä³¸öÒµÎñ²Ù×÷¿ªÊ¼»òÍê³Éʱ£¬²úÉúʼþ£¬²¢½«Ê¼þÅÉ·¢µ½Ê¼þ×ÜÏߣ¬¼´¿ÉÈÃʼþµÄ¶©ÔÄ·½¶ÔÆä½øÐд¦Àí£¬ÉõÖÁÊÇת·¢¸øÆäËüµÄ½ÓÊÕ·½¡£Õâ²»½öΪӦÓóÌÐò´øÀ´ÁËÐÔÄÜÉϵÄÌáÉý£¨ÒòΪʼþ¿ÉÒÔÒÔÒì²½µÄ·½Ê½´¦Àí£©£¬¶øÇÒʼþ·¢³ö·½ÍêÈ«²»ÐèÒªÁ˽âʼþÊÇÈçºÎ±»Â·Óɵ½ÆäËüµÄµØ·½£¬ÔÚÕâЩµØ·½ÓÖÊÇÈçºÎ´¦ÀíÕâЩʼþµÄ£¬Õâ¶ÔÒµÎñ·ÖÎö¡¢¿ª·¢ºÍ²âÊÔ¶¼´øÀ´Á˾޴óµÄºÃ´¦¡£Ê¼þÇý¶¯¼Ü¹¹£¨Event Driven Architecture£¬EDA£©µÄÓÅÔ½Ö®´¦ÎÒÒ²¾Í²»¾ßÌåÏê̸ÁË£¬ÍøÉÏÓÐÌ«¶àÕâ·½ÃæµÄÎÄÕ£¬¸ÐÐËȤµÄÅóÓѲ»·ÁÈ¥Á˽âһϡ£

·á¸»ÁìÓòÄ£ÐÍ

»òÐíÕâÖÖ˵·¨²¢²»Ç¡µ±£¬²»¹ýÔÚʵ¼ÊÖеÄÈ·ÓÐÕâÑùµÄÎÊÌâ¡£±ÈÈ磬Byteart RetailÖÐÓС°Óû§¡±ºÍ¡°¶©µ¥¡±Á½Ö־ۺϣ¬¡°Óû§¡±±¾ÉíÊDz»Ó¦¸Ã¾ÛºÏ¡°¶©µ¥¡±µÄ£¬´ÓÁìÓòÄ£Ð͵ĽǶȽ²£¬¡°Óû§¡±µÄ´æÔÚ²¢²»ÒÀÀµÓÚ¡°¶©µ¥¡±£¨¡°¶©µ¥¡±²¢·Ç¡°Óû§¡±µÄ×é³É²¿·Ö£©£¬Òò´ËËü¸ú¡°Æû³µ¡±ºÍ¡°³µÂÖ¡±Ö®¼äµÄ¹ØÏµÊDz»Í¬µÄ¡£

µ±È»£¬ÎÒÃÇÓÐÒ»¸öºÜÕý³£µÄÐèÇ󣺻òÐíij¸öÓû§µÄËùÓж©µ¥ÐÅÏ¢¡£ÄǼÈÈ»¡°Óû§¡±Ã»Óоۺϡ°¶©µ¥¡±£¬Ò²¾ÍÎÞ·¨´ÓÓû§¾ÛºÏÀ´µ¼º½µ½ÆäÏÂËùÓеĶ©µ¥¶ÔÏ󣬴ËʱÓÖÓ¦¸ÃÔõô°ìÄØ£¿ÔÚûÓÐÁìÓòʼþ֮ǰ£¬ÒªÊµÏÖÕâ¸öÐèÇó£¬Ö»ÄÜÔÚÓ¦ÓòãÏÈ»ñµÃÓû§ID£¬È»ºóʹÓÃÓû§²Ö´¢»ñµÃÓû§ÊµÌ壬ÔÙʹÓö©µ¥²Ö´¢ÕÒµ½¸ÃÓû§µÄËùÓж©µ¥¡£ÏÖÔÚ£¬ÈÃÎÒÃÇ¿´¿´£¬ÔÚByteart RetailÒýÈëÁËÁìÓòʼþÖ®ºó£¬Õⲿ·ÖÓÖÊÇÈçºÎʵÏֵġ£

Ê×ÏÈ£¬¶¨ÒåÒ»¸öGetUserOrdersEventÁìÓòʼþ£¬ÈÔÈ»ÔÚ¡°Óû§¡±ÊµÌåÖж¨ÒåÒ»¸öÊôÐÔ£¨ÒòΪÔÚ´úÂë±àдÖУ¬Ê¹ÓÃuser.SalesOrdersÕâÖÖд·¨¸üΪֱ¹Û£©£¬ÔÚÊôÐÔµÄgetterÖУ¬Ð´ÈëÒÔÏ´úÂ룺

public IEnumerable<SalesOrder> SalesOrders
{
get
{
IEnumerable<SalesOrder> result = null;
DomainEvent.Publish<GetUserOrdersEvent>(new GetUserOrdersEvent(this),
(e, ret, exc) =>
{
result = e.SalesOrders;
});
return result;
}
}

È»ºó£¬´´½¨Ò»¸öʼþ´¦ÀíÆ÷£º

public class GetUserOrdersEventHandler : IDomainEventHandler<GetUserOrdersEvent>
{
private readonly ISalesOrderRepository salesOrderRepository;

public GetUserOrdersEventHandler (ISalesOrderRepository salesOrderRepository)
{
this.salesOrderRepository = salesOrderRepository;
}

public void Handle(GetUserOrdersEvent evnt)
{
var user = evnt.Source as User;
evnt.SalesOrders = this.salesOrderRepository.FindSalesOrdersByUser(user);
}
}

ÔÚʼþ´¦ÀíÆ÷Íê³É´¦ÀíÖ®ºó£¬DomainEvent.Publish¾²Ì¬·½·¨»á»Øµ÷SalesOrdersÊôÐÔÖиø³öµÄÄǸöLambdaÓï¾ä£¬´Ó¶ø½«»ñµÃµÄ¶©µ¥·µ»Ø³öÈ¥¡£

ÕâÀïµÄÒâÒåÔ¶²»Ö»ÊÇÔÚÔ­À´µÄ»ù´¡ÉϸÄÁËÒ»¸öд·¨¡£Äã¿ÉÒÔ¿´µ½£¬ÕâÑù×ö½âñîÁËÁìÓòÄ£ÐͺͲִ¢²Ù×÷£¬ÔÚÁìÓòÄ£ÐÍÖУ¬ÅÉ·¢ÁìÓòʼþ£¬ËùÓеIJִ¢²Ù×÷¶¼ÊÇÔÚʼþ´¦ÀíÆ÷ÖÐÍê³É¡£ÁìÓòÄ£ÐÍÍêÈ«²»ÖªµÀÔÚʼþÅÉ·¢Ö®ºó»á·¢Éúʲô£¬ËüÖ»¹ÜµÈ´ý´¦Àí½á¹û¡£Óв»ÉÙ¶ÁÕßÅóÓÑÔø¾­ÎʹýÎÒ£ºÁìÓòÄ£ÐÍÖÐÈçºÎ·ÃÎʲִ¢£¿ÎÒÏ룬Õâ¾ÍÊǴ𰸡£

Ìá¸ßÁìÓòÄ£ÐÍÐÔÄÜ

¼ÙÉèÔÚÁìÓòÄ£ÐÍÖÐij¾ÛºÏÓÐÒ»¸öÊôÐÔ£¬ÆäÖаüº¬ÁËÒ»¸öºÜ´óµÄ¶ÔÏó£¬Ã¿´Î´Ó²Ö´¢¶ÁÈë¾ÛºÏµÄʱºò¶¼·Ç³£ºÄʱ£¬¶øÍùÍùÔÚ²éѯÖÐÓÖ²»ÐèÒª°üº¬Õâ¸öÊôÐÔµÄÖµ£¬ÔÚÕâÖÖÇé¿öÏ£¬¾Í¿ÉÒÔʹÓÃÁìÓòʼþÀ´½â¾öÎÊÌ⡣ʹÓÃÉÏÃæÀàËÆµÄ·½·¨£¬½«¸ÃÊôÐÔ¸ÄΪ²»Ö±½Ó´ÓÊý¾Ý¿â¶ÁÈ룬¶øÊǼòµ¥µØÅÉ·¢Ò»¸öÁìÓòʼþÈ»ºóÖ±½Ó·µ»Ø£¨¿ÉÒÔÖ±½Ó·µ»ØÓ¦Óò㣩£¬µ±Ê¼þ´¦ÀíÆ÷Íê³ÉÊý¾Ý¶ÁÈ¡ÒÔºó£¬ÒÔC#ÖеÄʼþÄ£ÐÍ֪ͨµ÷Ó÷½£¨±ÈÈçÓ¦Óò㣩£¬Ó¦ÓòãÔÚÊÕ¼¯ÍêËùÓÐÊý¾ÝÖ®ºó£¬ÔÙ·µ»Øµ½Õ¹Ïֲ㡣

ÕâÀïµÄʵÏÖ¿ÉÒÔʹÓÃC# 5.0µÄasync/await±à³ÌÄ£ÐÍ£¬ÎÒ»¹Ã»ÓÐÀ´µÃ¼°Êµ¼ù£¬ÕâÀïÖ»ÊÇÒ»ÖÖÏë·¨£¬²»¹ýʵÏÖÆðÀ´Ó¦¸Ã²»ÄÑ£¬µÈÓÐÁ˾ßÌåµÄ°¸Àý£¬ÔÙ¾ßÌå·ÖÎö¡£

×ܽá

±¾ÎÄÊ×ÏÈÌá³öÁËByteart Retail°¸ÀýÖÐÔ­ÓÐÁìÓòʼþÄ£Ð͵ÄʵÏÖ±×¶Ë£¬È»ºó¸ø³öÁËÖØ¹¹Ö®ºóµÄ½â¾ö·½°¸£¬²¢¶Ôʼþ´¦ÀíµÄÊÂÎñÐÔ½øÐÐÁËһЩ¼òµ¥µÄÌÖÂÛ£¬ÎÄÕÂ×îºó»¹ÌÖÂÛÁËÁìÓòʼþµÄÒâÒå¡£Byteart RetailÊÇÒ»¸öÑÝʾ°¸Àý£¬ÆäÖе±È»»áÓкܶ࿼ÂDz»È«µÄµØ·½£¬ÎÒҲûÓÐÌ«¶àµÄʱ¼äÄܹ»¸üÉîÈëµØ·ÖÎöÆäÖеÄÀû±×¡£Èç¹ûÓÐÅóÓÑÄܹ»·¢ÏÖÆäÖеÄÎÊÌ⣬²¢ÄóöÀ´¸ú´ó¼Ò̽ÌÖ£¬ÎÒÏ룬Õâ²»½öÊǶÔ×Ô¼º£¬¶øÇÒ¶ÔËûÈËÒ²ÊÇÒ»ÖֺܴóµÄ°ïÖú¡£ÕæÐÄÏ£Íû±¾ÎÄÄܸø´ó¼Ò´øÀ´Ò»Ð©Æôʾ£¬°ïÖú´ó¼Ò½â¾öʵ¼ÊÓ¦ÓÃÖÐÓöµ½µÄÀ§ÄÑ¡£

   
2153 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
 
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ