{"id":27856,"date":"2019-12-25T00:00:00","date_gmt":"2019-12-24T23:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=27856"},"modified":"2021-05-21T20:30:21","modified_gmt":"2021-05-21T18:30:21","slug":"orchestrare-gli-eventi-con-rebus","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/","title":{"rendered":"Orchestrare gli eventi con Rebus"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"27857\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/attachment\/image-00\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-00\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-27857\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Nel\u00a0<a href=\"https:\/\/blexin.com\/it\/blog\/risolviamo-il-rebus-della-comunicazione\/\" target=\"_blank\" rel=\"noreferrer noopener\">precedente articolo<\/a>, abbiamo visto come l\u2019utilizzo di un service bus possa apportare benefici in sistemi software dove \u00e8 necessario il disaccoppiamento tra le parti che li compongono. In particolare, abbiamo parlato di Rebus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rebus mette a disposizione una funzionalit\u00e0 molto interessante: poter orchestrare processi che hanno una lunga durata (long running process), e la cui evoluzione non \u00e8 sequenziale, ma basata sullo scatenarsi di eventi.<br>Per questo tipo di processi, esiste in letteratura il&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/www.enterpriseintegrationpatterns.com\/patterns\/messaging\/ProcessManager.html\" target=\"_blank\">Process Manager Pattern<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"334\" height=\"179\" data-attachment-id=\"27860\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/attachment\/image-1-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-1-2.png?fit=334%2C179&amp;ssl=1\" data-orig-size=\"334,179\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-1-2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-1-2.png?fit=334%2C179&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-1-2.png?resize=334%2C179&#038;ssl=1\" alt=\"\" class=\"wp-image-27860\" srcset=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-1-2.png?w=334&amp;ssl=1 334w, https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-1-2.png?resize=300%2C161&amp;ssl=1 300w\" sizes=\"auto, (max-width: 334px) 100vw, 334px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il process manager viene attivato da un evento (trigger message) ed opera come unit\u00e0 centrale di controllo, gestendo lo stato della sequenza di step che compongono il processo e decidendo le azioni da intraprendere in base a risultati intermedi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con Rebus, \u00e8 possibile modellare scenari del genere, in quanto mette a disposizione le cosiddette&nbsp;<strong>Sagas<\/strong>. Saga \u00e8 solo un altro nome per chiamare un Process Manager e quindi una saga non \u00e8 altro che l\u2019implementazione di una macchina a stati le cui transizioni tra stati sono determinate da messaggi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per ottenere tale implementazione abbiamo bisogno di:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Una rappresentazione dello stato della saga;<\/li><li>Un particolare handler che rappresenti un modello delle transizioni e azioni che costituiscano la saga stessa;<\/li><li>Una mappatura tra i campi dei messaggi e quelli che rappresentano lo stato della saga.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Per capire meglio questi aspetti, \u00e8 opportuno cimentarsi con un esempio concreto. Ho pensato ad un caso d\u2019uso molto semplice: l\u2019acquisto di un prodotto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Avremo un client (<strong>OrderClient<\/strong>), attraverso il quale un utente pu\u00f2 scegliere un prodotto da ordinare e confermarne l\u2019acquisto. La conferma dell\u2019acquisto coinvolge un servizio di pagamento (<strong>PaymentService<\/strong>). Il processo di acquisizione del prodotto termina quando un terzo servizio,&nbsp;<strong>OrderHandler<\/strong>, riceve informazioni sull\u2019ordine e sulla conferma di pagamento.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"567\" data-attachment-id=\"27863\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/attachment\/image-2-2-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-2-2.png?fit=1078%2C597&amp;ssl=1\" data-orig-size=\"1078,597\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-2-2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-2-2.png?fit=1024%2C567&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-2-2.png?resize=1024%2C567&#038;ssl=1\" alt=\"\" class=\"wp-image-27863\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-2-2-1024x567.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-2-2-980x543.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-2-2-480x266.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Partiamo da OrderClient.<br>La sua implementazione non si discosta molto dal&nbsp;<em>Sender<\/em>&nbsp;visto nell\u2019articolo precedente.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing (var activator = new BuiltinHandlerActivator())\n{\n\u00a0\u00a0\u00a0var sagaDbConnectionString = ConfigurationManager.ConnectionStrings&#x5B;&quot;SagasDB&quot;].ToString();\n\u00a0\u00a0\u00a0var bus = Configure.With(activator)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Transport(t = &gt; t.UseMsmqAsOneWayClient())\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Subscriptions(s =&gt; s.StoreInSqlServer(sagaDbConnectionString, &quot;SubscriptionsTable&quot;, isCentralized: true))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Start();\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Questa volta, per\u00f2, aggiungiamo alle configurazioni del bus anche quella che consente ad un publisher di memorizzare le sottoscrizioni agli eventi da esso pubblicati.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In questo esempio, abbiamo scelto di memorizzare le sottoscrizioni con SQL Server (ricordate di aggiungere il pacchetto&nbsp;<em>Rebus.SqlServer<\/em>&nbsp;alla Solution) e di utilizzare uno storage centralizzato, per fare in modo che possa essere comune tra il publisher e i suoi subscribers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Terminata la configurazione, OrderClient non fa altro che pubblicare dei messaggi sul bus a seconda degli input dell\u2019utente. In particolare, ne saranno pubblicati due tipi:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>bus.Publish(new Order(orderId, orderType)).Wait();<br>Dove&nbsp;<em>orderId<\/em>&nbsp;\u00e8 un intero generato casualmente (in seguito ne capiremo l\u2019importanza) e&nbsp;<em>orderType<\/em>&nbsp;\u00e8 una stringa che rappresenta il tipo di ordine;<\/li><li>bus.Publish(new OrderConfirmation(orderId, confirmation)).Wait();<br>Se l\u2019utente sceglie di confermare l\u2019ordine, viene inviato questo messaggio con lo stesso orderId e con il parametro&nbsp;<em>confirmation<\/em>, un booleano che porta con s\u00e9 la scelta dell\u2019utente di confermare o meno l\u2019ordine.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"942\" height=\"281\" data-attachment-id=\"27865\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/attachment\/image-3-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-3-2.png?fit=942%2C281&amp;ssl=1\" data-orig-size=\"942,281\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-3-2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-3-2.png?fit=942%2C281&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-3-2.png?resize=942%2C281&#038;ssl=1\" alt=\"\" class=\"wp-image-27865\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-3-2.png 942w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-3-2-480x143.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 942px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dal log \u00e8 possibile vedere inoltre che il messaggio di tipo<em>&nbsp;Order<\/em>&nbsp;\u00e8 indirizzato a&nbsp;<em>OrderHandler<\/em>&nbsp;mentre il messaggio di tipo&nbsp;<em>OrderConfirmation<\/em>&nbsp;a&nbsp;<em>PaymentService<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anche l\u2019implementazione del PaymentService \u00e8 molto semplice.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nnamespace PaymentService\n{\n\u00a0\u00a0\u00a0\u00a0class Program\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0static void Main(string&#x5B;] args)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0using (var activator = new BuiltinHandlerActivator())\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var db = ConfigurationManager.ConnectionStrings&#x5B;&quot;SagasDB&quot;].ToString();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0activator.Register((bus, context) =&gt; new Handler(bus));\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Configure.With(activator)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Transport(t =&gt; t.UseMsmq(&quot;PaymentService&quot;))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Subscriptions(s =&gt; s.StoreInSqlServer(db, &quot;SubscriptionsTable&quot;, isCentralized: true))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Start();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0activator.Bus.Subscribe &lt;OrderConfirmation&gt;().Wait();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.WriteLine(&quot;Press &#x5B;enter] to exit.&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.ReadLine();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0class Handler : IHandleMessages &lt;OrderConfirmation&gt;\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0readonly IBus _bus;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public Handler(IBus bus)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0_bus = bus;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public async Task Handle(OrderConfirmation message)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (message.Confirmation)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.WriteLine(&quot;Payment accepted&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var payment = true;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0_bus.Publish(new OrderPayment(message.Id, payment)).Wait();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Dopo aver configurato il bus, effettuiamo la sottoscrizione ai messaggi di tipo OrderConfirmation. L\u2019<em>handler<\/em>&nbsp;di tali messaggi si occupa inoltre di pubblicare un messaggio di tipo&nbsp;<em>OrderPayment<\/em>&nbsp;a cui sar\u00e0 sottoscritto<em>&nbsp;OrderHandler.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"956\" height=\"255\" data-attachment-id=\"27868\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/attachment\/image-4-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-4-2.png?fit=956%2C255&amp;ssl=1\" data-orig-size=\"956,255\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-4-2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-4-2.png?fit=956%2C255&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-4-2.png?resize=956%2C255&#038;ssl=1\" alt=\"\" class=\"wp-image-27868\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-4-2.png 956w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-4-2-480x128.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 956px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Veniamo infine alla parte pi\u00f9 interessante in quanto&nbsp;<em>OrderHandler<\/em>&nbsp;conterr\u00e0 l\u2019implementazione della saga.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nnamespace OrderHandler\n{\n\u00a0\u00a0\u00a0\u00a0class Program\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0static void Main(string&#x5B;] args)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var sagaDbConnectionString = ConfigurationManager.ConnectionStrings&#x5B;&quot;SagasDB&quot;].ToString();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0using (var activator = new BuiltinHandlerActivator())\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0activator.Register((bus, context) =&gt; new DemoSaga(bus));\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Configure.With(activator)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Subscriptions(s =&gt; s.StoreInSqlServer(sagaDbConnectionString, &quot;SubscriptionsTable&quot;, isCentralized: true))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Sagas(s =&gt; s.StoreInSqlServer(sagaDbConnectionString, &quot;Sagas&quot;, &quot;SagaIndex&quot;))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Transport(t =&gt; t.UseMsmq(&quot;OrderHandler&quot;))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Start();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0activator.Bus.Subscribe &lt;Order&gt;().Wait();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0activator.Bus.Subscribe &lt;OrderPayment&gt;().Wait();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.WriteLine(&quot;Press ENTER to quit&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.ReadLine();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Abbiamo aggiunto un\u2019ulteriore configurazione del bus, dove andiamo a impostare dove andranno salvate le informazioni della saga.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nSagas(s =&gt; s.StoreInSqlServer(sagaDbConnectionString, &quot;Sagas&quot;, &quot;SagaIndex&quot;))\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Successivamente, sottoscriviamo OrderHandler ai messaggi di tipo Order e&nbsp;<em>OrderPayment<\/em>.<br>Ma com\u2019\u00e8 fatto l\u2019handler di tali messaggi&nbsp;<em>DemoSaga<\/em>?<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n\u00a0\u00a0\u00a0class DemoSaga : Saga &lt;DemoSagaData&gt;,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0IAmInitiatedBy &lt;Order&gt;, IAmInitiatedBy &lt;OrderPayment&gt;\n\u00a0\u00a0\u00a0\u00a0{\n...\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Nella sua dichiarazione, vediamo che DemoSaga implementa la classe astratta&nbsp;<em>Saga<\/em>&nbsp;che viene resa concreta dalla definizione del tipo<em>&nbsp;DemoSagaData.<\/em><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nclass DemoSagaData : ISagaData\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public Guid Id { get; set ; }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public int Revision { get; set; }\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public int OrderId { get; set; }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public string OrderType { get; set; }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public bool OrderReceived { get; set; }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public bool PaymentReceived { get; set; }\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public bool Complete()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return OrderReceived &amp;&amp; PaymentReceived;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">DemoSagaData implementa l\u2019interfaccia ISagaData: in questo modo andiamo a rappresentare lo stato della saga.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inoltre, sempre nella dichiarazione, vediamo che DemoSaga implementa anche&nbsp;<em>IAmInitiatedBy&lt;TMessage&gt;<\/em>&nbsp;un\u2019interfaccia che consente di indicare ad un handler di messaggi quali tipi hanno il permesso di iniziare una nuova saga.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nprotected override void\nCorrelateMessages(ICorrelationConfig&lt;DemoSagaData&gt; config)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0config.Correlate&lt;Order&gt;(m =&gt; m.Id, d =&gt; d.OrderId);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0config.Correlate&lt;OrderPayment&gt; (m =&gt; m.Id, d =&gt; d.OrderId);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">L\u2019override del metodo CorrelateMessages (ICorrelationConfig&lt;TSagaData&gt; config) ci consentir\u00e0 di correlare i messaggi in ingresso con lo stato della saga, per evitare di avere sue istanze multiple. In questo esempio, abbiamo usato&nbsp;<em>orderId<\/em>&nbsp;come ID di correlazione tra messaggi e saga.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public async Task Handle(Order message)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (!IsNew) return;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Data.OrderType = message.Type;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Data.OrderReceived = true;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.WriteLine(@&quot;\nOrder Received -&gt; Type: &quot; + message.Type);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await CompleteSaga();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0public async Task Handle(OrderPayment message)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (IsNew) return;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Data.PaymentReceived = message.Payment;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.WriteLine(@&quot;\nPayment Received!\n&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0await CompleteSaga();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0async Task CompleteSaga()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (Data.Complete())\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.WriteLine(@&quot;\nOrder Complete\n&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MarkAsComplete();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Successivamente, implementiamo i metodi Handle() per i due messaggi in ingresso. L\u2019utilizzo di&nbsp;<em>IsNew<\/em>, un parametro della classe astratta&nbsp;<em>Saga<\/em>, consente di verificare se stiamo utilizzando un\u2019unica istanza della saga per l<em>\u2019orderId<\/em>&nbsp;corrente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dopo aver salvato le informazioni ricevute dai messaggi nello stato della saga, viene chiamato il metodo&nbsp;<em>CompleteSaga()<\/em>&nbsp;che verifica la ricezione dell\u2019 ordine e il buon fine del pagamento. Se l\u2019esito dell\u2019ordine \u00e8 positivo, viene invocato il metodo&nbsp;<em>MarkAsComplete()<\/em>&nbsp;che sancisce la fine della saga andando ad eliminare le relative informazioni dallo storage scelto.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"638\" height=\"371\" data-attachment-id=\"27872\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/attachment\/image-5-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-5-2.png?fit=638%2C371&amp;ssl=1\" data-orig-size=\"638,371\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-5-2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-5-2.png?fit=638%2C371&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-5-2.png?resize=638%2C371&#038;ssl=1\" alt=\"\" class=\"wp-image-27872\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-5-2.png 638w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-5-2-480x279.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 638px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Nell\u2019immagine sono presenti, appunto, le tabelle&nbsp;<em>Sagas<\/em>&nbsp;e&nbsp;<em>SagaIndex<\/em>&nbsp;i cui dati verranno rimossi al completamento della saga e mostriamo inoltre la tabella&nbsp;<em>SubscriptionTable<\/em>&nbsp;dove sono mappati i messaggi con i relativi subscribers.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"881\" height=\"423\" data-attachment-id=\"27874\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/attachment\/image-6-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-6-2.png?fit=881%2C423&amp;ssl=1\" data-orig-size=\"881,423\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-6-2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-6-2.png?fit=881%2C423&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-6-2.png?resize=881%2C423&#038;ssl=1\" alt=\"\" class=\"wp-image-27874\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-6-2.png 881w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-6-2-480x230.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 881px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Spero che questo articolo vi abbia incuriosito com\u2019\u00e8 stato per me trattare questo argomento.<br>Lascio il link del repository dove potete trovare l\u2019implementazione dell\u2019esempio nel&nbsp;<em>branch sagas<\/em>&nbsp;(<a href=\"https:\/\/github.com\/intersect88\/RebusDemo\/tree\/sagas\" target=\"_blank\" rel=\"noreferrer noopener\">&nbsp;https:\/\/github.com\/intersect88\/RebusDemo\/tree\/sagas&nbsp;<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al prossimo articolo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">E che la saga continui\u2026<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"454\" data-attachment-id=\"27877\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/attachment\/image-7-it\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-7-IT.png?fit=1089%2C483&amp;ssl=1\" data-orig-size=\"1089,483\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-7-IT\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-7-IT.png?fit=1024%2C454&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-7-IT.png?resize=1024%2C454&#038;ssl=1\" alt=\"\" class=\"wp-image-27877\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-7-IT-1024x454.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-7-IT-980x435.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-7-IT-480x213.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Vediamo come Rebus, oltre ad astrarci dal trasporto, ci permetta di gestire processi sulla base dei messaggi sul bus<\/p>\n","protected":false},"author":196716251,"featured_media":27857,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"{title}\n\n{excerpt}\n\n{url}","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637382,688637453,688637536],"class_list":["post-27856","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-c","tag-rebus","tag-swdesign"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Orchestrare gli eventi con Rebus - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Orchestrare gli eventi con Rebus - Blexin\" \/>\n<meta property=\"og:description\" content=\"Vediamo come Rebus, oltre ad astrarci dal trasporto, ci permetta di gestire processi sulla base dei messaggi sul bus\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2019-12-24T23:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-21T18:30:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00.png?fit=1024%2C608&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Genny Paudice\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Genny Paudice\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/\"},\"author\":{\"name\":\"Genny Paudice\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/ae0e97a3ebb79d2f73e4411c1eb28973\"},\"headline\":\"Orchestrare gli eventi con Rebus\",\"datePublished\":\"2019-12-24T23:00:00+00:00\",\"dateModified\":\"2021-05-21T18:30:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/\"},\"wordCount\":915,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image-00.png?fit=1024%2C608&ssl=1\",\"keywords\":[\"C#\",\"Rebus\",\"softwaredesign\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/\",\"name\":\"Orchestrare gli eventi con Rebus - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image-00.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2019-12-24T23:00:00+00:00\",\"dateModified\":\"2021-05-21T18:30:21+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/ae0e97a3ebb79d2f73e4411c1eb28973\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image-00.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image-00.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/orchestrare-gli-eventi-con-rebus\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Orchestrare gli eventi con Rebus\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/ae0e97a3ebb79d2f73e4411c1eb28973\",\"name\":\"Genny Paudice\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g\",\"caption\":\"Genny Paudice\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/genny-paudiceblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Orchestrare gli eventi con Rebus - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/","og_locale":"it_IT","og_type":"article","og_title":"Orchestrare gli eventi con Rebus - Blexin","og_description":"Vediamo come Rebus, oltre ad astrarci dal trasporto, ci permetta di gestire processi sulla base dei messaggi sul bus","og_url":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/","og_site_name":"Blexin","article_published_time":"2019-12-24T23:00:00+00:00","article_modified_time":"2021-05-21T18:30:21+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00.png?fit=1024%2C608&ssl=1","type":"image\/png"}],"author":"Genny Paudice","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Genny Paudice","Tempo di lettura stimato":"7 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/"},"author":{"name":"Genny Paudice","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973"},"headline":"Orchestrare gli eventi con Rebus","datePublished":"2019-12-24T23:00:00+00:00","dateModified":"2021-05-21T18:30:21+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/"},"wordCount":915,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00.png?fit=1024%2C608&ssl=1","keywords":["C#","Rebus","softwaredesign"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/","url":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/","name":"Orchestrare gli eventi con Rebus - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00.png?fit=1024%2C608&ssl=1","datePublished":"2019-12-24T23:00:00+00:00","dateModified":"2021-05-21T18:30:21+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/orchestrare-gli-eventi-con-rebus\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Orchestrare gli eventi con Rebus"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973","name":"Genny Paudice","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g","caption":"Genny Paudice"},"url":"https:\/\/blexin.com\/it\/author\/genny-paudiceblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-7fi","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-00.png?fit=1024%2C608&ssl=1","_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27856","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716251"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=27856"}],"version-history":[{"count":9,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27856\/revisions"}],"predecessor-version":[{"id":32713,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27856\/revisions\/32713"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/27857"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=27856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=27856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=27856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}