1+ using System . Diagnostics ;
2+ using Alba ;
3+ using IntegrationTests ;
4+ using Marten ;
5+ using Microsoft . AspNetCore . Builder ;
6+ using Microsoft . Extensions . Configuration ;
7+ using Microsoft . Extensions . DependencyInjection ;
8+ using Wolverine . Marten ;
9+ using Wolverine . Postgresql ;
10+ using Wolverine . Runtime ;
11+ using Wolverine . Tracking ;
12+
13+ namespace Wolverine . Http . Tests . Bugs ;
14+
15+ public class Bug_772_Saga_codegen
16+ {
17+ [ Fact ]
18+ public async Task can_compile_without_issue ( )
19+ {
20+ var builder = WebApplication . CreateBuilder ( Array . Empty < string > ( ) ) ;
21+
22+ builder . Services
23+ . AddMarten ( options =>
24+ {
25+ options . Connection ( Servers . PostgresConnectionString ) ;
26+ } )
27+ . UseLightweightSessions ( )
28+ . IntegrateWithWolverine ( ) ;
29+
30+ builder . Host . UseWolverine ( options =>
31+ {
32+ options . Discovery . IncludeAssembly ( GetType ( ) . Assembly ) ;
33+
34+ options . Policies . AutoApplyTransactions ( ) ;
35+ options . Policies . UseDurableLocalQueues ( ) ;
36+ options . Policies . UseDurableOutboxOnAllSendingEndpoints ( ) ;
37+
38+ Debug . WriteLine ( options . DescribeHandlerMatch ( typeof ( LongProcessSaga ) ) ) ;
39+ } ) ;
40+
41+ builder . Services . AddScoped < IDataService , DataService > ( ) ;
42+
43+ await using var host = await AlbaHost . For ( builder , app =>
44+ {
45+ app . MapWolverineEndpoints ( ) ;
46+ } ) ;
47+
48+ await host . InvokeMessageAndWaitAsync ( new BeginProcess ( Guid . NewGuid ( ) ) ) ;
49+ }
50+ }
51+
52+ public interface IDataService
53+ {
54+ Task < RecordData > GetData ( Guid messageDataId ) ;
55+ }
56+
57+ public class DataService : IDataService
58+ {
59+ public Task < RecordData > GetData ( Guid messageDataId )
60+ {
61+ var answer = new RecordData { MessageDataId = messageDataId , Data = Guid . NewGuid ( ) . ToString ( ) } ;
62+ return Task . FromResult ( answer ) ;
63+ }
64+ }
65+
66+ public class RecordData
67+ {
68+ public Guid MessageDataId { get ; set ; }
69+ public string Data { get ; set ; }
70+ }
71+
72+ public record BeginProcess ( Guid DataId ) ;
73+
74+ public record ContinueProcess ( Guid SagaId , Guid DataId , string Data ) ;
75+
76+ public static class BeginProcessMiddleware
77+ {
78+ public static async Task < RecordData > LoadAsync ( BeginProcess message , IDataService dataService )
79+ {
80+ return await dataService . GetData ( message . DataId ) ;
81+ }
82+
83+ public static void Finally ( )
84+ {
85+ // ...
86+ }
87+ }
88+
89+ public class LongProcessSaga : Saga
90+ {
91+ public Guid Id { get ; init ; }
92+
93+ [ Wolverine . Attributes . Middleware ( typeof ( BeginProcessMiddleware ) ) ]
94+ public static ( LongProcessSaga , OutgoingMessages ) Start ( BeginProcess message , RecordData ? sourceData = null )
95+ {
96+ var outgoingMessages = new OutgoingMessages ( ) ;
97+
98+ var saga = new LongProcessSaga
99+ {
100+ Id = Guid . NewGuid ( ) ,
101+ } ;
102+
103+ if ( sourceData is not null )
104+ {
105+ outgoingMessages . Add ( new ContinueProcess ( saga . Id , message . DataId , sourceData . Data ) ) ;
106+ }
107+
108+ return (
109+ saga ,
110+ outgoingMessages
111+ ) ;
112+ }
113+ }
0 commit comments