Esempio n. 1
0
        public ISagaConfigurator <TS, TD> AddSaga <TS, TD>()
            where TD : SagaState
            where TS : Saga <TD>
        {
            var hasMessages = _sagaTypeResolver.Register <TS, TD>();

            if (hasMessages)
            {
                Services.AddTransient <TD>(_ => default) // this will allow DI container validation at startup
Esempio n. 2
0
        public ISagaConfigurator <TS, TD> AddSaga <TS, TD>()
            where TS : Saga <TD> where TD : SagaState
        {
            var sagaType      = typeof(TS);
            var sagaStateType = typeof(TD);

            _services.AddScoped <TS>();

            var messageHandlerType = typeof(IHandleMessage <>).GetGenericTypeDefinition();

            var interfaces = sagaType.GetInterfaces();

            foreach (var i in interfaces)
            {
                if (!i.IsGenericType)
                {
                    continue;
                }

                var openGeneric = i.GetGenericTypeDefinition();
                if (!openGeneric.IsAssignableFrom(messageHandlerType))
                {
                    continue;
                }

                var messageType = i.GetGenericArguments().First();

                //TODO: move this check into SagaTypeResolver
                if (messageType.IsAssignableTo(typeof(ICommand)))
                {
                    var commandHandlerType = typeof(IHandleMessage <>).MakeGenericType(messageType);
                    if (_services.Any(sd => sd.ServiceType == commandHandlerType))
                    {
                        throw new TypeLoadException(
                                  $"there is already one handler registered for command type '{messageType.FullName}'");
                    }
                }

                _typeResolver.Register(messageType, (sagaType, sagaStateType));

                _services.AddTransient(i, sagaType);
            }

            _services.AddSingleton(typeof(ISagaStateService <,>).MakeGenericType(sagaType, sagaStateType),
                                   typeof(SagaStateService <,>).MakeGenericType(sagaType, sagaStateType));

            _services.AddSingleton(typeof(ISagaRunner <,>).MakeGenericType(sagaType, sagaStateType),
                                   typeof(SagaRunner <,>).MakeGenericType(sagaType, sagaStateType));

            _services.AddSingleton(typeof(ISagaFactory <,>).MakeGenericType(sagaType, sagaStateType),
                                   typeof(DefaultSagaFactory <,>).MakeGenericType(sagaType, sagaStateType));

            return(new SagaConfigurator <TS, TD>(_services));
        }
Esempio n. 3
0
        public ISagaConfigurator <TS, TD> AddSaga <TS, TD>()
            where TD : SagaState
            where TS : Saga <TD>
        {
            var hasMessages = _typeResolver.Register <TS, TD>();

            if (hasMessages)
            {
                Services.AddTransient <TS>()
                .AddTransient <ISagaFactory <TS, TD>, DefaultSagaFactory <TS, TD> >()
                .AddTransient <ISagaStateService <TS, TD>, SagaStateService <TS, TD> >()
                .AddTransient <ISagaRunner <TS, TD>, SagaRunner <TS, TD> >()
                .AddTransient <ISagaStateFactory <TD>, DefaultSagaStateFactory <TD> >();
            }

            return(new SagaConfigurator <TS, TD>(Services));
        }