示例#1
0
        public void ProcessMessage(IHandlerContext <RegisterOrderProcessCommand> context)
        {
            var message = context.Message;

            var orderProcess = new OrderProcess();

            var stream = _eventStore.CreateEventStream(orderProcess.Id);

            var initialized = orderProcess.Initialize();

            stream.AddEvent(initialized);
            stream.AddEvent(orderProcess.AssignCustomer(message.CustomerName, message.CustomerEMail));
            stream.AddEvent(orderProcess.AssignTargetSystem(message.TargetSystem, message.TargetSystemUri));

            var status = orderProcess.ChangeStatus("Cooling Off");

            stream.AddEvent(status);

            foreach (var quotedProduct in message.QuotedProducts)
            {
                stream.AddEvent(orderProcess.AddItem(quotedProduct.ProductId, quotedProduct.Description,
                                                     quotedProduct.Price));
            }

            using (_databaseContextFactory.Create(ProcessManagementData.ConnectionStringName))
            {
                _eventStore.Save(stream);
            }

            context.Publish(new OrderProcessRegisteredEvent
            {
                OrderProcessId  = orderProcess.Id,
                QuotedProducts  = message.QuotedProducts,
                CustomerName    = message.CustomerName,
                CustomerEMail   = message.CustomerEMail,
                OrderNumber     = initialized.OrderNumber,
                OrderDate       = initialized.DateRegistered,
                OrderTotal      = orderProcess.Total,
                Status          = status.Status,
                StatusDate      = status.StatusDate,
                TargetSystem    = message.TargetSystem,
                TargetSystemUri = message.TargetSystemUri
            });

            context.Send(new AcceptOrderProcessCommand
            {
                OrderProcessId = orderProcess.Id
            }, c => c.Defer(DateTime.Now.AddSeconds(10)).Local());
        }