// ========================================================================== // Services.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group // All rights reserved. // ========================================================================== using System; using Benchmarks.Tests.TestData; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using MongoDB.Driver; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using NodaTime; using NodaTime.Serialization.JsonNet; using Squidex.Domain.Apps.Core.Apps.Json; using Squidex.Domain.Apps.Core.Rules.Json; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas.Json; using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Log; using Squidex.Infrastructure.MongoDb; using Squidex.Infrastructure.States; namespace Benchmarks { public static class Services { public static IServiceProvider Create() { var services = new ServiceCollection(); services.AddSingleton(CreateTypeNameRegistry()); services.AddSingleton(); services.AddTransient(); services.AddSingleton( new MongoClient("mongodb://localhost")); services.AddSingleton( new SemanticLog(new ILogChannel[0], new ILogAppender[0], () => new JsonLogWriter())); services.AddSingleton( new MemoryCache(Options.Create(new MemoryCacheOptions()))); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(c => JsonSerializer.Create(c.GetRequiredService())); services.AddSingleton(c => CreateJsonSerializerSettings(c.GetRequiredService(), c.GetRequiredService())); services.AddSingleton(c => c.GetRequiredService().GetDatabase(Guid.NewGuid().ToString())); return services.BuildServiceProvider(); } public static void Cleanup(this IServiceProvider services) { var mongoClient = services.GetRequiredService(); var mongoDatabase = services.GetRequiredService(); mongoClient.DropDatabase(mongoDatabase.DatabaseNamespace.DatabaseName); if (services is IDisposable disposable) { disposable.Dispose(); } } private static TypeNameRegistry CreateTypeNameRegistry() { var result = new TypeNameRegistry(); result.Map(typeof(MyEvent)); return result; } private static JsonSerializerSettings CreateJsonSerializerSettings(TypeNameRegistry typeNameRegistry, FieldRegistry fieldRegistry) { var settings = new JsonSerializerSettings(); settings.SerializationBinder = new TypeNameSerializationBinder(typeNameRegistry); settings.ContractResolver = new ConverterContractResolver( new AppClientsConverter(), new AppContributorsConverter(), new ClaimsPrincipalConverter(), new InstantConverter(), new LanguageConverter(), new LanguagesConfigConverter(), new NamedGuidIdConverter(), new NamedLongIdConverter(), new NamedStringIdConverter(), new PropertiesBagConverter(), new PropertiesBagConverter(), new RefTokenConverter(), new RuleConverter(), new SchemaConverter(fieldRegistry), new StringEnumConverter()); settings.NullValueHandling = NullValueHandling.Ignore; settings.DateFormatHandling = DateFormatHandling.IsoDateFormat; settings.DateParseHandling = DateParseHandling.None; settings.TypeNameHandling = TypeNameHandling.Auto; settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); BsonJsonConvention.Register(JsonSerializer.Create(settings)); return settings; } } }