Exemplo n.º 1
0
        public static IServiceCollection AddTransacto(this IServiceCollection services, params IPlugin[] plugins) =>
        plugins.Concat(Standard.Plugins).Aggregate(services
                                                   .AddRouting()
                                                   .AddSingleton(MessageTypeMapper.Create(Array.ConvertAll(plugins,
                                                                                                           plugin => new MessageTypeMapper(plugin.MessageTypes))))
                                                   // projections
                                                   .AddSingleton <Func <IPlugin, NpgsqlConnection> >(provider => {
            var cache = new ConcurrentDictionary <string, NpgsqlConnectionStringBuilder>();
            return(plugin => new NpgsqlConnection(cache.GetOrAdd(plugin.Name, username =>
                                                                 new NpgsqlConnectionStringBuilder(
                                                                     provider.GetRequiredService <NpgsqlConnectionStringBuilder>().ConnectionString)
            {
                Username = username
            }).ConnectionString));
        }),
                                                   (services, plugin) => {
            var rootProvider   = services.BuildServiceProvider();
            var pluginServices = new ServiceCollection();
            plugin.ConfigureServices(pluginServices);

            var pluginProvider = pluginServices
                                 .AddSingleton(rootProvider.GetRequiredService <EventStoreClient>())
                                 .AddSingleton(rootProvider.GetRequiredService <IStreamStore>())
                                 .AddSingleton(rootProvider.GetRequiredService <IMessageTypeMapper>())
                                 .AddSingleton <InMemoryProjectionDatabase>()
                                 .AddHostedService(provider => new InMemoryProjectionHost(
                                                       provider.GetRequiredService <EventStoreClient>(),
                                                       provider.GetRequiredService <IMessageTypeMapper>(),
                                                       provider.GetRequiredService <InMemoryProjectionDatabase>(),
                                                       provider.GetServices <ProjectionHandler <InMemoryProjectionDatabase>[]>().ToArray()))
                                 .AddSingleton <Func <NpgsqlConnection> >(_ => () => rootProvider
                                                                          .GetRequiredService <Func <IPlugin, NpgsqlConnection> >()
                                                                          .Invoke(plugin))
                                 .AddHostedService(provider => new NpgsqlProjectionHost(
                                                       provider.GetRequiredService <EventStoreClient>(),
                                                       provider.GetRequiredService <IMessageTypeMapper>(),
                                                       provider.GetRequiredService <Func <NpgsqlConnection> >(),
                                                       provider.GetServices <NpgsqlProjection>().ToArray()))
                                 .AddHostedService(provider => new StreamStoreProjectionHost(
                                                       provider.GetRequiredService <EventStoreClient>(),
                                                       provider.GetRequiredService <IMessageTypeMapper>(),
                                                       provider.GetRequiredService <IStreamStore>(),
                                                       provider.GetServices <StreamStoreProjection>().ToArray()))
                                 .BuildServiceProvider();
            return(pluginProvider
                   .GetServices <IHostedService>()
                   .Aggregate(services.AddSingleton(Tuple.Create(plugin, (IServiceProvider)pluginProvider)),
                              (services, service) => services.AddSingleton(service)));
        });
        public static IServiceCollection AddTransacto(this IServiceCollection services, params IPlugin[] plugins) =>
        plugins.Concat(Standard.Plugins).Aggregate(services
                                                   .AddRouting()
                                                   .AddSingleton(MessageTypeMapper.Create(Array.ConvertAll(plugins,
                                                                                                           plugin => new MessageTypeMapper(plugin.MessageTypes))))
                                                   // write model
                                                   .AddSingleton <CommandHandlerModule>(provider => new GeneralLedgerEntryModule(
                                                                                            provider.GetRequiredService <EventStoreClient>(),
                                                                                            provider.GetRequiredService <IMessageTypeMapper>(),
                                                                                            TransactoSerializerOptions.Events,
                                                                                            provider.GetRequiredService <ICommandContext>()))
                                                   .AddSingleton <CommandHandlerModule>(provider => new ChartOfAccountsModule(
                                                                                            provider.GetRequiredService <EventStoreClient>(),
                                                                                            provider.GetRequiredService <IMessageTypeMapper>(),
                                                                                            TransactoSerializerOptions.Events))
                                                   .AddSingleton <CommandHandlerModule>(provider => new GeneralLedgerModule(
                                                                                            provider.GetRequiredService <EventStoreClient>(),
                                                                                            provider.GetRequiredService <IMessageTypeMapper>(),
                                                                                            TransactoSerializerOptions.Events))
                                                   // projections
                                                   .AddSingleton <Func <IPlugin, NpgsqlConnection> >(provider => {
            var cache = new ConcurrentDictionary <string, NpgsqlConnectionStringBuilder>();
            return(plugin => new NpgsqlConnection(cache.GetOrAdd(plugin.Name, username =>
                                                                 new NpgsqlConnectionStringBuilder(
                                                                     provider.GetRequiredService <NpgsqlConnectionStringBuilder>().ConnectionString)
            {
                Username = username
            }).ConnectionString));
        })
                                                   .AddSingleton <Func <IPlugin, InMemoryReadModel> >(provider => {
            var cache = new ConcurrentDictionary <string, InMemoryReadModel>();
            return(plugin => cache.GetOrAdd(plugin.Name, _ => new InMemoryReadModel()));
        })
                                                   .AddHttpContextAccessor()
                                                   .AddSingleton <ICommandContext, HttpContextCommandContext>(),
                                                   (services, plugin) => {
            var rootProvider   = services.BuildServiceProvider();
            var pluginServices = new ServiceCollection();
            plugin.ConfigureServices(pluginServices);

            var pluginProvider = pluginServices
                                 .AddSingleton(rootProvider.GetRequiredService <EventStoreClient>())
                                 .AddSingleton(rootProvider.GetRequiredService <IStreamStore>())
                                 .AddSingleton(rootProvider.GetRequiredService <IMessageTypeMapper>())
                                 .AddSingleton(provider => rootProvider
                                               .GetRequiredService <Func <IPlugin, InMemoryReadModel> >().Invoke(plugin))
                                 .AddHostedService(provider => new InMemoryProjectionHost(
                                                       provider.GetRequiredService <EventStoreClient>(),
                                                       provider.GetRequiredService <IMessageTypeMapper>(),
                                                       provider.GetRequiredService <InMemoryReadModel>(),
                                                       provider.GetServices <ProjectionHandler <InMemoryReadModel>[]>().ToArray()))
                                 .AddSingleton <Func <NpgsqlConnection> >(provider => () => rootProvider
                                                                          .GetRequiredService <Func <IPlugin, NpgsqlConnection> >()
                                                                          .Invoke(plugin))
                                 .AddHostedService(provider => new NpgSqlProjectionHost(
                                                       provider.GetRequiredService <EventStoreClient>(),
                                                       provider.GetRequiredService <IMessageTypeMapper>(),
                                                       provider.GetRequiredService <Func <NpgsqlConnection> >(),
                                                       provider.GetServices <NpgsqlProjection>().ToArray()))
                                 .AddHostedService(provider => new StreamStoreProjectionHost(
                                                       provider.GetRequiredService <EventStoreClient>(),
                                                       provider.GetRequiredService <IMessageTypeMapper>(),
                                                       provider.GetRequiredService <IStreamStore>(),
                                                       provider.GetServices <StreamStoreProjection>().ToArray()))
                                 .BuildServiceProvider();
            return(pluginProvider
                   .GetServices <IHostedService>()
                   .Aggregate(services.AddSingleton(Tuple.Create(plugin, (IServiceProvider)pluginProvider)),
                              (services, service) => services.AddSingleton(service)));
        });