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
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)); }
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)); }