src/Coast.Core/Saga/SagaManager.cs

(开头部分) 2KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

namespace Coast.Core
{
    using System;
    using System.Collections.Generic;
    using System.Threading;
    using System.Threading.Tasks;
    using Coast.Core.DataLayer;
    using Coast.Core.EventBus;
    using Microsoft.Extensions.Logging;

    public class SagaManager : ISagaManager
    {
        private readonly IRepositoryFactory _repositoryFactory;
        private readonly IEventBus _eventPublisher;
        private readonly ILogger<SagaManager> _logger;

        public SagaManager(IRepositoryFactory repositoryFactory, IEventBus eventPublisher, ILogger<SagaManager> logger)
        {
            _repositoryFactory = repositoryFactory;
            _eventPublisher = eventPublisher;
            _logger = logger;
        }

        /// <summary>
        /// Create a saga that executes the saga steps in sequence.
        /// </summary>
        /// <param name="steps">saga steps.</param>
        /// <param name="cancellationToken">Propagates notification that operations should be canceled.</param>
        /// <returns>A <see cref="Task{TResult}"/> saga instance.</returns>
        public async Task<Saga> CreateAsync(IEnumerable<EventRequestBody> steps = default, CancellationToken cancellationToken = default)
        {
            var saga = new Saga(steps);
            return saga;
        }

        /// <summary>
        /// start a new saga what executes the saga steps in sequence. And execute the first saga step.
        /// </summary>
        /// <param name="saga">saga steps.</param>
        /// <param name="cancellationToken">Propagates notification that operations should be canceled.</param>
        /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
        public async Task StartAsync(Saga saga, CancellationToken cancellationToken = default)
        {
            if (saga is null)
            {
                throw new ArgumentNullException(nameof(saga));
            }

            if (saga.State != SagaStateEnum.Created)
            {
                throw new ArgumentException("The saga has been created before.");
            }

            var @sagaEvents = saga.Start();

            using (var session = _repositoryFactory.OpenSession())
            {
                session.StartTransaction();

                var sagaRepository = session.ConstructSagaRepository();
后面还有 19 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。