Когда делают Интеграционное Событие зависимости зависимости, контроллер не называется c # - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь установить связь между микросервисами с использованием eventbus, когда я использую инъекцию зависимостей, мой контроллер больше не может вызываться.

У меня есть Controller

  public class CustomersController : ControllerBase
    {
        private readonly ICustomerRepository _customerRepository;
        private readonly IIdentityService _identityService;
        private readonly ICustomerIntegrationEventService _customerIntegrationEventService; 

        public CustomersController(ICustomerRepository customerRepository, IIdentityService identityService, ICustomerIntegrationEventService customerIntegrationEventService)
        {
            _customerRepository = customerRepository ?? throw new ArgumentNullException(nameof(customerRepository));
            _identityService = identityService ?? throw new ArgumentNullException(nameof(identityService));
            _customerIntegrationEventService = customerIntegrationEventService ?? throw new ArgumentNullException(nameof(customerIntegrationEventService));
        }

        }

В этом Controller у меня есть метод с именем Add.Это в основном добавляет клиента.Когда клиент добавлен, я хотел бы уведомить другой микросервис и отправить данные на служебную шину.Пока что я использую Integration Event.Но в тот момент, когда внедрение зависимостей делается в контроллере.фронт больше не может поразить контроллер, возвращая ошибку 500.

    public async Task<IActionResult> Add(Customer value)
        {
            var idAdded = await _customerRepository.Add(value).ConfigureAwait(false);
            if (!idAdded.HasValue)
                return BadRequest();
            var integrationEvent = new CustomerIntegrationEvent(idAdded.Value, value);
            await _customerIntegrationEventService.AddAndSaveEventAsync(integrationEvent);
            return CreatedAtAction(nameof(Get), new { id = idAdded.Value }, null);
        }

Вскоре ниже показано, как этот класс строит _customerIntegrationEventService

CustomerIntegrationEventService

  public class CustomerIntegrationEventService : ICustomerIntegrationEventService
    {

        private readonly Func<DbConnection, IIntegrationEventLogService> _integrationEventLogServiceFactory;
        private readonly IEventBus _eventBus;
        private readonly ApplicationDataContext _osDataContext;
        private readonly IntegrationEventLogContext _eventLogContext;
        private readonly IIntegrationEventLogService _eventLogService;

        public CustomerIntegrationEventService(
            IEventBus eventBus,
            ApplicationDataContext hrDataContext,
            IntegrationEventLogContext eventLogContext,
            Func<DbConnection, IIntegrationEventLogService> integrationEventLogServiceFactory)
        {
            _osDataContext = hrDataContext ?? throw new ArgumentNullException(nameof(hrDataContext));
            _eventLogContext = eventLogContext ?? throw new ArgumentNullException(nameof(eventLogContext));
            _integrationEventLogServiceFactory = integrationEventLogServiceFactory ?? throw new ArgumentNullException(nameof(integrationEventLogServiceFactory));
            _eventBus = eventBus ?? throw new ArgumentNullException(nameof(eventBus));
            _eventLogService = _integrationEventLogServiceFactory(hrDataContext.Database.GetDbConnection());
        }

        public async Task PublishEventsThroughEventBusAsync()
        {
            var pendindLogEvents = await _eventLogService.RetrieveEventLogsPendingToPublishAsync();
            foreach (var logEvt in pendindLogEvents)
            {
                try
                {
                    await _eventLogService.MarkEventAsInProgressAsync(logEvt.EventId);
                    _eventBus.Publish(logEvt.IntegrationEvent);
                    await _eventLogService.MarkEventAsPublishedAsync(logEvt.EventId);
                }
                catch (Exception)
                {
                    await _eventLogService.MarkEventAsFailedAsync(logEvt.EventId);
                }
            }
        }

        public async Task AddAndSaveEventAsync(IntegrationEvent evt)
        {
            await _eventLogService.SaveEventAsync(evt, _osDataContext.Database.CurrentTransaction.GetDbTransaction());
        }
    }

все эти коды были взяты из примера https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/multi-container-microservice-net-applications/subscribe-events

Я сделал инъекцию зависимостей при запуске, но в любом случае ошибка сохраняется

     public void AddIntegrationServices(IServiceCollection services, IConfiguration configuration)
        {
            services.AddTransient<Func<DbConnection, IIntegrationEventLogService>>(
              sp => (DbConnection c) => new IntegrationEventLogService(c));

            services.AddTransient<ICustomerIntegrationEventService, CustomerIntegrationEventService>();

        }

Как я могу вхотя бы увидеть ошибку за вещами, или как я придумаю это решение.Этот код основан на Microsoft eShopOnContainers

...