Skip to content

Commit 6b175e1

Browse files
authored
Update to sample for nh custom saga finder to NSB 10 (#7551)
* copy the existing sample, add prerelease file, Updated to .NET 10, Updated LangVersion to preview, Updated package references to latest alphas. Update to use new C# features like record type
1 parent 8199d4d commit 6b175e1

13 files changed

+262
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 16
4+
VisualStudioVersion = 16.0.29728.190
5+
MinimumVisualStudioVersion = 15.0.26730.12
6+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample", "Sample\Sample.csproj", "{48F718EE-6C45-41BA-80EC-81BF34D4A623}"
7+
EndProject
8+
Global
9+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
10+
Debug|Any CPU = Debug|Any CPU
11+
EndGlobalSection
12+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
13+
{48F718EE-6C45-41BA-80EC-81BF34D4A623}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
14+
{48F718EE-6C45-41BA-80EC-81BF34D4A623}.Debug|Any CPU.Build.0 = Debug|Any CPU
15+
EndGlobalSection
16+
GlobalSection(SolutionProperties) = preSolution
17+
HideSolutionNode = FALSE
18+
EndGlobalSection
19+
EndGlobal
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
public record CompleteOrder : IMessage
2+
{
3+
public required string OrderId { get; init; }
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
public record CompletePaymentTransaction : IMessage
2+
{
3+
public required string PaymentTransactionId { get; init; }
4+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using NServiceBus.Extensibility;
2+
using NServiceBus.Persistence;
3+
using NServiceBus.Sagas;
4+
5+
#region finder
6+
class CompletePaymentTransactionSagaFinder : ISagaFinder<OrderSagaData, CompletePaymentTransaction>
7+
{
8+
public Task<OrderSagaData> FindBy(CompletePaymentTransaction message, ISynchronizedStorageSession storageSession, IReadOnlyContextBag context, CancellationToken cancellationToken = default)
9+
{
10+
var session = storageSession.Session();
11+
var orderSagaData = session.QueryOver<OrderSagaData>()
12+
.Where(d => d.PaymentTransactionId == message.PaymentTransactionId)
13+
.SingleOrDefault();
14+
return Task.FromResult(orderSagaData);
15+
}
16+
}
17+
#endregion
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
record IssuePaymentRequest : IMessage
2+
{
3+
public required string PaymentTransactionId { get; init; }
4+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class IssuePaymentRequestHandler : IHandleMessages<IssuePaymentRequest>
2+
{
3+
public Task Handle(IssuePaymentRequest message, IMessageHandlerContext context)
4+
{
5+
var completePayment = new CompletePaymentTransaction
6+
{
7+
PaymentTransactionId = message.PaymentTransactionId
8+
};
9+
return context.SendLocal(completePayment);
10+
}
11+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+

2+
3+
#region saga
4+
5+
using Microsoft.Extensions.Logging;
6+
7+
public class OrderSaga :
8+
Saga<OrderSagaData>,
9+
IAmStartedByMessages<StartOrder>,
10+
IHandleMessages<CompletePaymentTransaction>,
11+
IHandleMessages<CompleteOrder>
12+
{
13+
private readonly ILogger<OrderSaga> logger;
14+
15+
public OrderSaga(ILogger<OrderSaga> logger)
16+
{
17+
this.logger = logger;
18+
}
19+
20+
protected override void ConfigureHowToFindSaga(SagaPropertyMapper<OrderSagaData> mapper)
21+
{
22+
mapper.MapSaga(saga => saga.OrderId)
23+
.ToMessage<StartOrder>(msg => msg.OrderId)
24+
.ToMessage<CompleteOrder>(msg => msg.OrderId);
25+
}
26+
27+
public Task Handle(StartOrder message, IMessageHandlerContext context)
28+
{
29+
Data.PaymentTransactionId = Guid.NewGuid().ToString();
30+
31+
logger.LogInformation("Saga with OrderId {SagaOrderId} received StartOrder with OrderId {MessageOrderId}", Data.OrderId, message.OrderId);
32+
var issuePaymentRequest = new IssuePaymentRequest
33+
{
34+
PaymentTransactionId = Data.PaymentTransactionId
35+
};
36+
return context.SendLocal(issuePaymentRequest);
37+
}
38+
39+
public Task Handle(CompletePaymentTransaction message, IMessageHandlerContext context)
40+
{
41+
logger.LogInformation("Transaction with Id {PaymentTransactionId} completed for order id {OrderId}", Data.PaymentTransactionId, Data.OrderId);
42+
var completeOrder = new CompleteOrder
43+
{
44+
OrderId = Data.OrderId
45+
};
46+
return context.SendLocal(completeOrder);
47+
}
48+
49+
public Task Handle(CompleteOrder message, IMessageHandlerContext context)
50+
{
51+
logger.LogInformation("Saga with OrderId {SagaOrderId} received CompleteOrder with OrderId {MessageOrderId}", Data.OrderId, message.OrderId);
52+
MarkAsComplete();
53+
return Task.CompletedTask;
54+
}
55+
}
56+
57+
#endregion
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
public class OrderSagaData : ContainSagaData
2+
{
3+
public virtual string OrderId { get; set; }
4+
5+
public virtual string PaymentTransactionId { get; set; }
6+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Microsoft.Extensions.Hosting;
3+
using NHibernate.Cfg;
4+
using NHibernate.Dialect;
5+
using NHibernate.Driver;
6+
using NServiceBus.Persistence;
7+
8+
9+
10+
var endpointName = "Samples.NHibernateCustomSagaFinder";
11+
Console.Title = endpointName;
12+
13+
var builder = Host.CreateApplicationBuilder(args);
14+
15+
var endpointConfiguration = new EndpointConfiguration(endpointName);
16+
endpointConfiguration.EnableInstallers();
17+
endpointConfiguration.UseSerialization<SystemJsonSerializer>();
18+
endpointConfiguration.UseTransport(new LearningTransport());
19+
20+
#region config
21+
22+
// for SqlExpress use Data Source=.\SqlExpress;Initial Catalog=NsbSamplesNhCustomSagaFinder;Integrated Security=True;Max Pool Size=100;Encrypt=false
23+
var connectionString = @"Server=localhost,1433;Initial Catalog=NsbSamplesNhCustomSagaFinder;User Id=SA;Password=yourStrong(!)Password;Max Pool Size=100;Encrypt=false";
24+
var hibernateConfig = new Configuration();
25+
hibernateConfig.DataBaseIntegration(x =>
26+
{
27+
x.ConnectionString = connectionString;
28+
x.Dialect<MsSql2012Dialect>();
29+
x.Driver<MicrosoftDataSqlClientDriver>();
30+
});
31+
32+
var persistence = endpointConfiguration.UsePersistence<NHibernatePersistence>()
33+
.UseConfiguration(hibernateConfig);
34+
35+
#endregion
36+
37+
SqlHelper.EnsureDatabaseExists(connectionString);
38+
39+
builder.UseNServiceBus(endpointConfiguration);
40+
41+
var host = builder.Build();
42+
await host.StartAsync();
43+
44+
var messageSession = host.Services.GetRequiredService<IMessageSession>();
45+
46+
Console.WriteLine("Press 'enter' to send a StartOrder message. Press any other key to exit.");
47+
while (true)
48+
{
49+
var key = Console.ReadKey();
50+
Console.WriteLine();
51+
52+
if (key.Key != ConsoleKey.Enter)
53+
{
54+
break;
55+
}
56+
57+
var startOrder = new StartOrder
58+
{
59+
OrderId = "123"
60+
};
61+
await messageSession.SendLocal(startOrder);
62+
63+
Console.WriteLine("StartOrder message sent");
64+
}
65+
66+
await host.StopAsync();
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<OutputType>Exe</OutputType>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<LangVersion>preview</LangVersion>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<PackageReference Include="NHibernate" Version="5.*" />
12+
<PackageReference Include="NServiceBus" Version="10.0.0-alpha.1" />
13+
<PackageReference Include="NServiceBus.Extensions.Hosting" Version="4.0.0-alpha.1" />
14+
<PackageReference Include="NServiceBus.NHibernate" Version="11.0.0-alpha.1" />
15+
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.*" />
16+
</ItemGroup>
17+
18+
</Project>

0 commit comments

Comments
 (0)