Съжалявам, че не бях ясен. Всъщност няма никакви зависимости между манипулаторите, някои от тях просто обработват един и същи тип съобщение. Например в нашата система ние обработваме фактури, много опростено това се случва, когато фактура пристигне в системата: съобщение „InvoiceArrived“ се изпраща до nservicebus и трябва да се случат две неща, информацията за фактурата трябва да бъде изпратена до външна система и имейлът трябва да бъде изпратен до лицето, което трябва да обработва фактурата (различно лице в зависимост от информацията във фактурата). Тези две неща не зависят едно от друго, но експортирането към външната система е много важно, докато имейлът не е толкова важен.
Това, което се случи, беше, че манипулаторът, изпращащ имейл, беше стартиран първи и се срина (поради лоша конфигурация), беше повторен опит пет пъти, но се срина всеки път и не се осъществи нито имейл, нито експортиране към външна система. Коригирането на конфигурацията беше лесно, но ни показа недостатък в нашия дизайн.
Сега разбирам, че трябва да преосмислим дизайна, защото указването на реда, в който се изпълняват манипулаторите, няма да реши нищо, тъй като обратната ситуация също не е желателна, че първо се изпълнява манипулаторът за експортиране и след това се срива манипулаторът за изпращане по имейл, което води до пет повторни опити и пет успешни експортирания (но без успешен имейл). Предполагам, че ще трябва да изпратим един тип съобщение за всеки манипулатор...
Оригинално съобщение:
Използваме NServiceBus, за да настроим манипулатори за редица събития, всяко от които изпраща уникален тип съобщение към шината (в момента 6, но броят им нараства). Някои от тези събития (2 в момента) имат повече от един манипулатор и искаме те да се изпълняват в определен ред за всеки от типовете съобщения.
Имаме собствен хост и знам, че можете да посочите реда като: NServiceBus.Configure.With() ... .UnicastBus() .LoadMessageHandlers(First.Then().AndThen().AndThen() //etc)
Да кажем, че имаме манипулатори на съобщения H1_1, H1_2 (и двете обработват съобщения от тип 1, H1_1 да се изпълняват преди H1_2) съответно H2_1, H2_2 (обработват съобщения от тип 2) и H3 - H6 (единствените, които обработват съобщения от тип 3 - 6)
Разбира се, можем да управляваме това, като посочим всички манипулатори
.LoadMessageHandlers(First<H1_1>.Then<H1_1>().Then<H2_1>() //etc)
но това означава, че всеки път, когато добавим нов манипулатор, трябва да добавим към тази конфигурация,
възможно ли е да се пише
.LoadMessageHandlers(First<H1_1>.Then<H2_1>()) //and all the other handlers are run there after?
Това, разбира се, би било по-добре, но все пак H1_1 и H2_1 нямат нищо общо помежду си и няма да се изпълняват на едно и също съобщение по никакъв начин. Няма ли начин да се посочи за тип съобщение, т.е. за тип 1 First<H1_1>.Then<H1_2>()
и за тип 2 First<H2_1>.Then<H2_2>()
и за всички останали типове не е необходима спецификация, тъй като има само един манипулатор?
Благодаря ви много предварително - всяка помощ ще бъде високо оценена!