Skip to content

Commit

Permalink
Add startup task for automatically registering bson serialization pro…
Browse files Browse the repository at this point in the history
…viders and bson serializers
  • Loading branch information
woksin committed Feb 4, 2025
1 parent 05914de commit c3133c6
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 7 deletions.
4 changes: 4 additions & 0 deletions Source/Kernel/Setup/ChronicleServerSiloBuilderExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
// Copyright (c) Cratis. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using Cratis.Chronicle.Concepts.Jobs;
using Cratis.Chronicle.Connections;
using Cratis.Chronicle.Diagnostics.OpenTelemetry;
using Cratis.Chronicle.Grains;
using Cratis.Chronicle.Grains.Jobs;
using Cratis.Chronicle.Grains.Observation.Placement;
using Cratis.Chronicle.Grains.Observation.Reactors.Clients;
using Cratis.Chronicle.Grains.Observation.Reducers.Clients;
Expand All @@ -17,6 +19,7 @@
using Cratis.Chronicle.Storage;
using Cratis.Json;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;

namespace Orleans.Hosting;
Expand All @@ -34,6 +37,7 @@ public static class ChronicleServerSiloBuilderExtensions
/// <returns><see cref="ISiloBuilder"/> for continuation.</returns>
public static ISiloBuilder AddChronicleToSilo(this ISiloBuilder builder, Action<IChronicleBuilder>? configure = default)
{
builder.Services.TryAddSingleton<IJobTypes, JobTypes>();
builder
.AddChronicleServicesAsInMemory()
.AddPlacementDirector<ConnectedObserverPlacementStrategy, ConnectedObserverPlacementDirector>()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) Cratis. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using Cratis.Compliance.MongoDB;
using Cratis.Types;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
Expand All @@ -12,20 +13,25 @@ namespace Cratis.Chronicle.Storage.MongoDB;
/// </summary>
/// <param name="serviceProvider">The <see cref="IServiceProvider"/>.</param>
/// <param name="types">The <see cref="ITypes"/>.</param>
public class CustomSerializersRegistrationService(IServiceProvider serviceProvider, ITypes types) : IHostedService
public class CustomSerializersRegistrationService(IServiceProvider serviceProvider, ITypes types) : IStartupTask
{
/// <inheritdoc/>
public Task StartAsync(CancellationToken cancellationToken)
public Task Execute(CancellationToken cancellationToken)
{
foreach (var type in types.FindMultiple<IBsonSerializationProvider>()
.Where(type => type.Assembly.FullName!.Contains("Chronicle") && !type.IsGenericType)
.Except([typeof(EncryptionKeySerializer)]))
{
var provider = (IBsonSerializationProvider)ActivatorUtilities.CreateInstance(serviceProvider, type);
BsonSerializer.RegisterSerializationProvider(provider);
}
foreach (var type in types.FindMultiple<IBsonSerializer>()
.Where(type => type.Assembly.FullName!.Contains("Chronicle") && !type.IsGenericType))
.Where(type => type.Assembly.FullName!.Contains("Chronicle") && !type.IsGenericType)
.Except([typeof(EncryptionKeySerializer)]))
{
var serializer = (IBsonSerializer)ActivatorUtilities.CreateInstance(serviceProvider, type);
BsonSerializer.TryRegisterSerializer(serializer.ValueType, serializer);
}
return Task.CompletedTask;
}

/// <inheritdoc/>
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public static IChronicleBuilder WithMongoDB(this IChronicleBuilder builder, Chro
/// <returns><see cref="IChronicleBuilder"/> for continuation.</returns>
public static IChronicleBuilder WithMongoDB(this IChronicleBuilder builder, string server, string database = WellKnownDatabaseNames.Chronicle)
{
builder.SiloBuilder.AddStartupTask<CustomSerializersRegistrationService>(ServiceLifecycleStage.First);
builder.SiloBuilder
.UseMongoDBClient(server)

Expand All @@ -51,7 +52,6 @@ public static IChronicleBuilder WithMongoDB(this IChronicleBuilder builder, stri
services.AddSingleton<IStorage, Storage.MongoDB.Storage>();
});

builder.Services.AddHostedService<CustomSerializersRegistrationService>();
return builder;
}
}

0 comments on commit c3133c6

Please sign in to comment.