public override Task Invoke(AspectContext context, AspectDelegate next)
        {
            var dataValidator = context.ServiceProvider.GetService(typeof(IDataValidator)) as IDataValidator;

            CheckResolved(dataValidator);
            var dataStateFactory = context.ServiceProvider.GetService(typeof(IDataStateFactory)) as IDataStateFactory;

            CheckResolved(dataStateFactory);
            var dataValidationContext = new DataValidationContext(context);

            dataValidator.Validate(dataValidationContext);
            context.SetDataValidationContext(dataValidationContext);
            var dataState = dataStateFactory.CreateDataState(dataValidationContext);

            if (context.Implementation is IDataStateProvider dataStateProvider)
            {
                dataStateProvider.DataState = dataState;
            }
            else
            {
                var implementationTypeInfo = context.Implementation.GetType().GetTypeInfo();
                var dataStateProperty      = implementationTypeInfo.GetProperty("DataState");
                if (dataStateProperty != null && dataStateProperty.CanWrite)
                {
                    dataStateProperty.GetReflector().SetValue(context.Implementation, dataState);
                }
            }
            return(context.Invoke(next));
        }
        public IDataState CreateDataState(DataValidationContext dataValidationContext)
        {
            var dataValidationErrors = new DataValidationErrorCollection();

            foreach (var error in dataValidationContext.DataMetaDatas.SelectMany(x => x.Errors))
            {
                dataValidationErrors.Add(error);
            }
            var isValid = dataValidationContext.DataMetaDatas.All(x => x.State != DataValidationState.Invalid);

            return(new DataState(isValid, dataValidationErrors));
        }
Ejemplo n.º 3
0
 public static void SetDataValidationContext(this AspectContext aspectContext, DataValidationContext dataValidationContext)
 {
     if (aspectContext == null)
     {
         throw new ArgumentNullException(nameof(aspectContext));
     }
     if (dataValidationContext == null)
     {
         throw new ArgumentNullException(nameof(dataValidationContext));
     }
     aspectContext.AdditionalData[DataValidationContextKey] = dataValidationContext;
 }