ÔÚÎÒ¿ª·¢µÄ¡¶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»È«µÄµØ·½£¬ÎÒҲûÓÐÌ«¶àµÄʱ¼äÄܹ»¸üÉîÈëµØ·ÖÎöÆäÖеÄÀû±×¡£Èç¹ûÓÐÅóÓÑÄܹ»·¢ÏÖÆäÖеÄÎÊÌ⣬²¢ÄóöÀ´¸ú´ó¼Ò̽ÌÖ£¬ÎÒÏ룬Õâ²»½öÊǶÔ×Ô¼º£¬¶øÇÒ¶ÔËûÈËÒ²ÊÇÒ»ÖֺܴóµÄ°ïÖú¡£ÕæÐÄÏ£Íû±¾ÎÄÄܸø´ó¼Ò´øÀ´Ò»Ð©Æôʾ£¬°ïÖú´ó¼Ò½â¾öʵ¼ÊÓ¦ÓÃÖÐÓöµ½µÄÀ§ÄÑ¡£
|