public async Task Process(Guid senderId, Guid receiverId, string subjectText, string messageText) { var handledMessages = new List <HandledMessage>(); // Create and save message var message = new Message { Created = DateTimeOffset.Now, ReceiverId = receiverId, SenderId = senderId, Subject = subjectText, Text = messageText }; await _messageDbContext.AddAsync(message); await _messageDbContext.SaveChangesAsync(); // Call handlers var preferedMessageTypes = await _messageDbContext.PreferedMessageTypes.Where(m => m.IdentityId == receiverId).ToListAsync(); foreach (var messageHandler in _messageHandlerFactory.CreateHandlers()) { if (!preferedMessageTypes.Any() || preferedMessageTypes.Any(mt => mt.Type == messageHandler.Type)) { var messageResult = await messageHandler.HandledMessage(message); handledMessages.Add(new HandledMessage { MessageId = message.Id, Sent = messageResult.Sent, Type = messageHandler.Type }); } } // Save result await _messageDbContext.AddRangeAsync(handledMessages); await _messageDbContext.SaveChangesAsync(); }