I have updated NSB from 7.7.6 to 8.0.3.
In the code I have a TradeSagaFinder for all saga types.
The problem that I am facing is that IAmStartedByMessages<StartSendTradeSaga>
expect an implementation of ConfigureHowToFindSaga.
The code that makes the compiler happy
protected override void ConfigureHowToFindSaga(SagaPropertyMapper<InTradeData> mapper)
{
mapper.MapSaga(saga => saga.TradeId)
.ToMessage<StartPendingTradeSaga>(msg => msg.TradeId.Id);
}
When NSB starts I get this error:
System.Exception: A custom ISagaFinder and an existing mapping where found for message 'TradingService.InternalMessages.StartPendingTradeSaga'. Either remove the message mapping or remove the finder. Finder name 'DomainModel.NServiceBusMessageHandlers.TradeSaga.TradeSagaFinder'.
at NServiceBus.Sagas.SagaMetadata.ApplyScannedFinders(SagaMapper mapper, Type sagaEntityType, IEnumerable`1 availableTypes, Conventions conventions) in /_/src/NServiceBus.Core/Sagas/SagaMetadata.cs:line 257
at NServiceBus.Sagas.SagaMetadata.Create(Type sagaType, IEnumerable`1 availableTypes, Conventions conventions) in /_/src/NServiceBus.Core/Sagas/SagaMetadata.cs:line 176
at NServiceBus.Sagas.SagaMetadataCollection.<>c__DisplayClass3_0.<Initialize>b__0(Type t) in /_/src/NServiceBus.Core/Sagas/SagaMetadataCollection.cs:line 48
at System.Linq.Enumerable.WhereSelectListIterator`2.ToList()
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at NServiceBus.Sagas.SagaMetadataCollection.Initialize(IEnumerable`1 availableTypes, Conventions conventions) in /_/src/NServiceBus.Core/Sagas/SagaMetadataCollection.cs:line 47
at NServiceBus.Features.Sagas.Setup(FeatureConfigurationContext context) in /_/src/NServiceBus.Core/Sagas/Sagas.cs:line 52
at NServiceBus.Features.Feature.SetupFeature(FeatureConfigurationContext config) in /_/src/NServiceBus.Core/Features/Feature.cs:line 204
at NServiceBus.Features.FeatureActivator.FeatureInfo.InitializeFrom(FeatureConfigurationContext featureConfigurationContext) in /_/src/NServiceBus.Core/Features/FeatureActivator.cs:line 240
at NServiceBus.Features.FeatureActivator.ActivateFeature(FeatureInfo featureInfo, List`1 featuresToActivate, FeatureConfigurationContext featureConfigurationContext) in /_/src/NServiceBus.Core/Features/FeatureActivator.cs:line 203
at NServiceBus.Features.FeatureActivator.SetupFeatures(FeatureConfigurationContext featureConfigurationContext) in /_/src/NServiceBus.Core/Features/FeatureActivator.cs:line 54
at NServiceBus.FeatureComponent.Initalize(FeatureConfigurationContext featureConfigurationContext) in /_/src/NServiceBus.Core/Features/FeatureComponent.cs:line 29
at NServiceBus.EndpointCreator.Configure() in /_/src/NServiceBus.Core/EndpointCreator.cs:line 61
at NServiceBus.EndpointCreator.Create(SettingsHolder settings, Configuration hostingConfiguration) in /_/src/NServiceBus.Core/EndpointCreator.cs:line 26
at NServiceBus.HostCreator.CreateWithExternallyManagedContainer(EndpointConfiguration endpointConfiguration, IServiceCollection serviceCollection) in /_/src/NServiceBus.Core/Hosting/HostCreator.cs:line 30
at NServiceBus.EndpointWithExternallyManagedContainer.Create(EndpointConfiguration configuration, IServiceCollection serviceCollection) in /_/src/NServiceBus.Core/EndpointWithExternallyManagedContainer.cs:line 18
at NServiceBus.HostBuilderExtensions.<>c__DisplayClass0_0.<UseNServiceBus>b__0(HostBuilderContext ctx, IServiceCollection serviceCollection) in /_/src/NServiceBus.Extensions.Hosting/HostBuilderExtensions.cs:line 34
at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at TradingService.Host.HostMain.Main(String[] args) in C:\Projects\TradingService\Code\TradingService\TradingService.Host\HostMain.cs:line 32
at TradingService.Host.HostMain.<Main>(String[] args)
So at startup NSB find all ISagaFinder implementations.
A snippet from TradeSagaFinder class
public class TradeSagaFinder :
ISagaFinder<InTradeData, StartPendingTradeSaga>,
ISagaFinder<InTradeData, ApproveCertificateTrade>,
ISagaFinder<InTradeData, PriceAccepted>,
ISagaFinder<OutTradeData, StartSendTradeSaga>,
ISagaFinder<OutTradeData, StatusFromMarketMaker>,
ISagaFinder<OutTradeData, AuditTrailIdReceived>
{
public async Task<InTradeData> FindBy(StartPendingTradeSaga message, ISynchronizedStorageSession storageSession, IReadOnlyContextBag context, CancellationToken cancellationToken = default)
{
var session = storageSession.Session();
var sagaData = await session.Query<InTradeData>().FirstOrDefaultAsync(x => x.TradeId == message.TradeId.Id && x.TradeType == message.TradeId.TradeType, cancellationToken);
return sagaData;
}
public async Task<InTradeData> FindBy(ApproveCertificateTrade message, ISynchronizedStorageSession storageSession, IReadOnlyContextBag context, CancellationToken cancellationToken = default)
{
var session = storageSession.Session();
var sagaData = await session.Query<InTradeData>().FirstOrDefaultAsync(x => x.TradeId == message.CertificateTradeRequestId && x.TradeType == message.TradeType, cancellationToken);
return sagaData;
}
How can i make NSB aware of the TradeSagaFinder in the ConfigureHowToFindSaga?
Link to documentation