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