示例#1
0
        public static IServiceCollection AddOpenSleigh(this IServiceCollection services, Action <IBusConfigurator> configure = null)
        {
            var systemInfo = SystemInfo.New();

            var typeResolver     = new TypeResolver();
            var sagaTypeResolver = new SagaTypeResolver(typeResolver);

            services.AddTransient <IMessageBus, DefaultMessageBus>()
            .AddSingleton(systemInfo)
            .AddSingleton <ISagaTypeResolver>(sagaTypeResolver)
            .AddSingleton <ISagasRunner, SagasRunner>()
            .AddSingleton <ITypesCache, TypesCache>()
            .AddSingleton <ITypeResolver>(typeResolver)
            .AddSingleton <ISerializer, JsonSerializer>()
            .AddSingleton <IMessageHandlersResolver, DefaultMessageHandlersResolver>()
            .AddSingleton <IMessageHandlersRunner, DefaultMessageHandlersRunner>()
            .AddSingleton <IMessageContextFactory, DefaultMessageContextFactory>()
            .AddSingleton <IMessageProcessor, MessageProcessor>()
            .AddHostedService <SubscribersBackgroundService>()

            .AddTransient <IOutboxProcessor, OutboxProcessor>()
            .AddSingleton(OutboxProcessorOptions.Default)
            .AddHostedService <OutboxBackgroundService>()

            .AddTransient <IOutboxCleaner, OutboxCleaner>()
            .AddSingleton(OutboxCleanerOptions.Default)
            .AddHostedService <OutboxCleanerBackgroundService>();

            var builder = new BusConfigurator(services, sagaTypeResolver, typeResolver, systemInfo);

            configure?.Invoke(builder);

            return(services);
        }
        public static IServiceCollection AddOpenSleigh(this IServiceCollection services, Action <IBusConfigurator> configure = null)
        {
            var stateTypeResolver = new SagaTypeResolver();

            services.AddSingleton <ISagaTypeResolver>(stateTypeResolver)
            .AddSingleton <ISagasRunner, SagasRunner>()
            .AddSingleton <ITypesCache, TypesCache>()
            .AddSingleton <ITypeResolver>(ctx =>
            {
                var resolver = new TypeResolver();

                var sagaTypeResolver = ctx.GetRequiredService <ISagaTypeResolver>();
                var sagaTypes        = sagaTypeResolver.GetSagaTypes();
                foreach (var t in sagaTypes)
                {
                    resolver.Register(t);
                }

                return(resolver);
            })
            .AddSingleton <IMessageContextFactory, DefaultMessageContextFactory>()
            .AddScoped <IMessageBus, DefaultMessageBus>()
            .AddSingleton <IMessageProcessor, MessageProcessor>()
            .AddSingleton <IOutboxProcessor>(ctx =>
            {
                var repo      = ctx.GetRequiredService <IOutboxRepository>();
                var publisher = ctx.GetRequiredService <IPublisher>();
                var logger    = ctx.GetRequiredService <ILogger <OutboxProcessor> >();
                return(new OutboxProcessor(repo, publisher, OutboxProcessorOptions.Default, logger));
            })
            .AddSingleton <IOutboxCleaner>(ctx =>
            {
                var repo = ctx.GetRequiredService <IOutboxRepository>();
                return(new OutboxCleaner(repo, OutboxCleanerOptions.Default));
            });

            var builder = new BusConfigurator(services, stateTypeResolver);

            configure?.Invoke(builder);

            services.AddHostedService <SubscribersBackgroundService>()
            .AddHostedService <OutboxBackgroundService>()
            .AddHostedService <OutboxCleanerBackgroundService>();

            return(services);
        }