public async Task <Result> TriggerActionAsync(object id, string action, string triggeredBy, CancellationToken cancellationToken)
        {
            var actionEvents = new ActionEvents();

            using (var unitOfWork = UnitOfWorkFactory.Create())
            {
                var entity = await unitOfWork.ReadOnlyRepository <TContext, TEntity>().GetByIdAsync(cancellationToken, id);

                if (entity is IEntityAggregateRoot)
                {
                    IDomainActionEvent actionEvent = actionEvents.CreateEntityActionEvent(action, null, entity, triggeredBy);
                    if (actionEvent != null)
                    {
                        ((IEntityAggregateRoot)entity).AddActionEvent(actionEvent);

                        var validationResult = unitOfWork.Repository <TContext, TEntity>().Update(entity, triggeredBy);
                        if (validationResult.IsFailure)
                        {
                            return(Result.ObjectValidationFail <TEntity>(validationResult.ObjectValidationErrors));
                        }

                        return(await unitOfWork.CompleteAsync(cancellationToken).ConfigureAwait(false));
                    }
                }
            }

            return(Result.Ok());
        }
        public Result TriggerAction(object id, string action, string triggeredBy)
        {
            var actionEvents = new ActionEvents();

            using (var unitOfWork = UnitOfWorkFactory.Create())
            {
                var entity = unitOfWork.ReadOnlyRepository <TContext, TEntity>().GetById(id);

                if (entity is IEntityAggregateRoot)
                {
                    IDomainActionEvent actionEvent = actionEvents.CreateEntityActionEvent(action, null, entity, triggeredBy);
                    if (actionEvent != null)
                    {
                        ((IEntityAggregateRoot)entity).AddActionEvent(actionEvent);

                        var validationResult = unitOfWork.Repository <TContext, TEntity>().Update(entity, triggeredBy);
                        if (validationResult.IsFailure)
                        {
                            return(Result.ObjectValidationFail <TEntity>(validationResult.ObjectValidationErrors));
                        }

                        return(unitOfWork.Complete());
                    }
                }
            }

            return(Result.Ok());
        }
Exemple #3
0
        public IDomainActionEvent CreateEntityActionEvent(string action, dynamic args, object entity, string triggeredBy)
        {
            IDomainActionEvent actionEvent = null;

            if (entity is IEntity)
            {
                Type   genericType = typeof(EntityActionEvent <>);
                Type[] typeArgs    = { entity.GetType() };
                Type   constructed = genericType.MakeGenericType(typeArgs);
                actionEvent = (IDomainActionEvent)Activator.CreateInstance(constructed, action, args, entity, triggeredBy);
            }

            return(actionEvent);
        }
        public Dictionary <string, List <string> > GetActions(Type entityType)
        {
            Dictionary <string, List <string> > actions = new Dictionary <string, List <string> >();

            IDomainActionEvent actionEvent = null;

            if (typeof(IEntity).IsAssignableFrom(entityType))
            {
                Type   genericType = typeof(EntityActionEvent <>);
                Type[] typeArgs    = { entityType };
                Type   constructed = genericType.MakeGenericType(typeArgs);
                actionEvent = (IDomainActionEvent)Activator.CreateInstance(constructed, null, null, null, null);
            }

            if (actionEvent != null)
            {
                var     eventHandlerInterfaceType = typeof(IDomainEventHandler <>).MakeGenericType(actionEvent.GetType());
                var     types    = typeof(IEnumerable <>).MakeGenericType(eventHandlerInterfaceType);
                dynamic handlers = HttpContext.GetInstance(types);

                foreach (var handler in handlers)
                {
                    IDictionary <string, string> handleActions = (IDictionary <string, string>)handler.HandleActions;
                    foreach (var handleAction in handleActions)
                    {
                        if (!actions.ContainsKey(handleAction.Key))
                        {
                            actions.Add(handleAction.Key, new List <string>());
                        }

                        if (!actions[handleAction.Key].Contains(handleAction.Value))
                        {
                            actions[handleAction.Key].Add(handleAction.Value);
                        }
                    }
                }
            }

            return(actions);
        }
 public void AddActionEvent(IDomainActionEvent actionEvent)
 {
     _domainEvents.Add(actionEvent);
 }