using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Raven.Client.Documents; using Raven.Client.Documents.Indexes; using Raven.Client.Http; using Finch.Identity; using Finch.Media; using Finch.Numbers; namespace Finch.Raven; public static class FinchBuilderExtensions { public static FinchBuilder AddRavenDb(this FinchBuilder builder) { builder.AddModule(); return builder; } } internal class FinchRavenModule : FinchModule { public override void ConfigureServices(IServiceCollection services, IConfiguration configuration) { services.AddSingleton(); services.AddSingleton(CreateRavenStore); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddTransient(); services.AddScoped(); services.Replace(ServiceLifetime.Scoped); services.Replace(ServiceLifetime.Scoped); services.Replace(ServiceLifetime.Scoped); services.AddOptions(); services.AddOptions().Bind(configuration.GetSection("Finch:Raven")); services.ConfigureOptions(); } /// /// Creates and configures the raven store /// protected IDocumentStore CreateRavenStore(IServiceProvider services) { IFinchOptions options = services.GetService(); RavenOptions ravenOptions = options.For(); IRavenDocumentConventionsBuilder conventionsBuilder = services.GetService(); IDocumentStore store = new DocumentStore() { Database = ravenOptions.Database, Urls = new string[1] { ravenOptions.Url }, Conventions = { AggressiveCache = { Duration = TimeSpan.FromMinutes(ravenOptions.CacheInMinutes), Mode = AggressiveCacheMode.TrackChanges } } }; conventionsBuilder.Run(store.Conventions); IDocumentStore raven = store.Initialize(); // create all indexes IEnumerable indexes = ravenOptions.Indexes.BuildAll(options, store); IndexCreation.CreateIndexes(indexes, store, database: ravenOptions.Database); return raven; } }