Пример #1
0
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            var concreteTypes = BuildManager.GetReferencedAssemblies().Cast <Assembly>().Where(assembly => !assembly.GlobalAssemblyCache).ConcreteTypes();

            IList <IModelMetadataConfiguration> configurations = new List <IModelMetadataConfiguration>();

            concreteTypes.Where(type => typeof(IModelMetadataConfiguration).IsAssignableFrom(type))
            .Each(type =>
            {
                container.Register(Component.For(type).LifestyleTransient());
                configurations.Add((IModelMetadataConfiguration)container.Resolve(type));
            });

            container.Register(Component.For <IModelMetadataRegistry>().ImplementedBy <ModelMetadataRegistry>().LifestyleSingleton());

            var registry = container.Resolve <IModelMetadataRegistry>();

            configurations.Each(configuration => registry.RegisterModelProperties(configuration.ModelType, configuration.Configurations));

            IList <ModelValidatorProvider> validatorProviders = new List <ModelValidatorProvider>(ModelValidatorProviders.Providers);

            validatorProviders.Insert(0, new ExtendedModelValidatorProvider());
            var compositeModelValidatorProvider = new CompositeModelValidatorProvider(validatorProviders.ToArray());

            ModelMetadataProviders.Current = new ExtendedModelMetadataProvider(registry);
            ModelValidatorProviders.Providers.Clear();
            ModelValidatorProviders.Providers.Add(compositeModelValidatorProvider);
        }
        public void GetModelValidators_ReturnsValidatorsFromAllProviders()
        {
            // Arrange
            var validator1 = Mock.Of <IModelValidator>();
            var validator2 = Mock.Of <IModelValidator>();
            var validator3 = Mock.Of <IModelValidator>();
            var provider1  = new Mock <IModelValidatorProvider>();

            provider1.Setup(p => p.GetValidators(It.IsAny <ModelMetadata>()))
            .Returns(new[] { validator1, validator2 });
            var provider2 = new Mock <IModelValidatorProvider>();

            provider2.Setup(p => p.GetValidators(It.IsAny <ModelMetadata>()))
            .Returns(new[] { validator3 });
            var providerProvider = new Mock <IModelValidatorProviderProvider>();

            providerProvider.Setup(p => p.ModelValidatorProviders)
            .Returns(new[] { provider1.Object, provider2.Object });
            var compositeModelValidator = new CompositeModelValidatorProvider(providerProvider.Object);
            var modelMetadata           = new EmptyModelMetadataProvider().GetMetadataForType(
                modelAccessor: null,
                modelType: typeof(string));

            // Act
            var result = compositeModelValidator.GetValidators(modelMetadata);

            // Assert
            Assert.Equal(new[] { validator1, validator2, validator3 }, result);
        }
Пример #3
0
 public CustomObjectValidator(IModelMetadataProvider modelMetadataProvider, IList <IModelValidatorProvider> validatorProviders)
 {
     _modelMetadataProvider = modelMetadataProvider;
     _validatorProviders    = validatorProviders;
     _validatorCache        = new ValidatorCache();
     _validatorProvider     = new CompositeModelValidatorProvider(validatorProviders);
 }
        public CompositeModelValidatorProviderTests()
        {
            provider1 = new Mock<ModelValidatorProvider>();
            provider2 = new Mock<ModelValidatorProvider>();

            compositeProvider = new CompositeModelValidatorProvider(provider1.Object, provider2.Object);
        }
Пример #5
0
        public CompositeModelValidatorProviderTests()
        {
            provider1 = new Mock <ModelValidatorProvider>();
            provider2 = new Mock <ModelValidatorProvider>();

            compositeProvider = new CompositeModelValidatorProvider(provider1.Object, provider2.Object);
        }
Пример #6
0
 /// <summary>
 ///     Initializes a new instance of <see cref="FluentValidationObjectModelValidator" />.
 /// </summary>
 public FluentValidationObjectModelValidator(IModelMetadataProvider modelMetadataProvider,
                                             IList <IModelValidatorProvider> validatorProviders)
 {
     _modelMetadataProvider =
         modelMetadataProvider ?? throw new ArgumentNullException(nameof(modelMetadataProvider));
     _validatorCache    = new ValidatorCache();
     _validatorProvider = new CompositeModelValidatorProvider(validatorProviders);
 }
Пример #7
0
        /// <summary>
        ///     Initializes a new instance of <see cref="FluentValidationObjectModelValidator" />.
        /// </summary>
        public FluentValidationObjectModelValidator(IModelMetadataProvider modelMetadataProvider, IList <IModelValidatorProvider> validatorProviders,
                                                    IValidatorFactory validatorFactory)
        {
            if (modelMetadataProvider == null)
            {
                throw new ArgumentNullException(nameof(modelMetadataProvider));
            }

            _validatorFactory      = validatorFactory;
            _modelMetadataProvider = modelMetadataProvider;
            _validatorCache        = new ValidatorCache();
            _validatorProvider     = new CompositeModelValidatorProvider(validatorProviders);
        }
Пример #8
0
        /// <summary>
        /// Initializes a new instance of <see cref="ObjectModelValidator"/>.
        /// </summary>
        /// <param name="modelMetadataProvider">The <see cref="ModelMetadataProvider"/>.</param>
        /// <param name="validatorProviders">The list of <see cref="IModelValidatorProvider"/>.</param>
        public ObjectModelValidator(
            IModelMetadataProvider modelMetadataProvider,
            IList <IModelValidatorProvider> validatorProviders)
        {
            if (modelMetadataProvider == null)
            {
                throw new ArgumentNullException(nameof(modelMetadataProvider));
            }

            if (validatorProviders == null)
            {
                throw new ArgumentNullException(nameof(validatorProviders));
            }

            _modelMetadataProvider = modelMetadataProvider;
            _validatorCache        = new ValidatorCache();

            _validatorProvider = new CompositeModelValidatorProvider(validatorProviders);
        }
Пример #9
0
    public void GetModelValidators_ReturnsValidatorsFromAllProviders()
    {
        // Arrange
        var validatorMetadata = new object();
        var validator1        = new ValidatorItem(validatorMetadata);
        var validator2        = new ValidatorItem(validatorMetadata);
        var validator3        = new ValidatorItem(validatorMetadata);

        var provider1 = new Mock <IModelValidatorProvider>();

        provider1.Setup(p => p.CreateValidators(It.IsAny <ModelValidatorProviderContext>()))
        .Callback <ModelValidatorProviderContext>(c =>
        {
            c.Results.Add(validator1);
            c.Results.Add(validator2);
        });

        var provider2 = new Mock <IModelValidatorProvider>();

        provider2.Setup(p => p.CreateValidators(It.IsAny <ModelValidatorProviderContext>()))
        .Callback <ModelValidatorProviderContext>(c =>
        {
            c.Results.Add(validator3);
        });

        var compositeModelValidator = new CompositeModelValidatorProvider(new[] { provider1.Object, provider2.Object });
        var modelMetadata           = new EmptyModelMetadataProvider().GetMetadataForType(typeof(string));

        // Act
        var validatorProviderContext = new ModelValidatorProviderContext(modelMetadata, new List <ValidatorItem>());

        compositeModelValidator.CreateValidators(validatorProviderContext);

        // Assert
        Assert.Equal(
            new[] { validator1, validator2, validator3 },
            validatorProviderContext.Results.ToArray());
    }
        // To enable unit testing
        internal static void AddMvcCoreServices(IServiceCollection services)
        {
            //
            // Options
            //
            services.TryAddEnumerable(
                ServiceDescriptor.Transient <IConfigureOptions <MvcOptions>, MvcCoreMvcOptionsSetup>());
            services.TryAddEnumerable(
                ServiceDescriptor.Transient <IPostConfigureOptions <MvcOptions>, MvcOptionsConfigureCompatibilityOptions>());
            services.TryAddEnumerable(
                ServiceDescriptor.Transient <IConfigureOptions <ApiBehaviorOptions>, ApiBehaviorOptionsSetup>());
            services.TryAddEnumerable(
                ServiceDescriptor.Transient <IConfigureOptions <RouteOptions>, MvcCoreRouteOptionsSetup>());

            //
            // Action Discovery
            //
            // These are consumed only when creating action descriptors, then they can be deallocated

            services.TryAddEnumerable(
                ServiceDescriptor.Transient <IApplicationModelProvider, DefaultApplicationModelProvider>());
            services.TryAddEnumerable(
                ServiceDescriptor.Transient <IApplicationModelProvider, ApiBehaviorApplicationModelProvider>());
            services.TryAddEnumerable(
                ServiceDescriptor.Transient <IActionDescriptorProvider, ControllerActionDescriptorProvider>());

            services.TryAddSingleton <IActionDescriptorCollectionProvider, ActionDescriptorCollectionProvider>();

            //
            // Action Selection
            //
            services.TryAddSingleton <IActionSelector, ActionSelector>();
            services.TryAddSingleton <ActionConstraintCache>();

            // Will be cached by the DefaultActionSelector
            services.TryAddEnumerable(
                ServiceDescriptor.Transient <IActionConstraintProvider, DefaultActionConstraintProvider>());

            //
            // Controller Factory
            //
            // This has a cache, so it needs to be a singleton
            services.TryAddSingleton <IControllerFactory, DefaultControllerFactory>();

            // Will be cached by the DefaultControllerFactory
            services.TryAddTransient <IControllerActivator, DefaultControllerActivator>();

            services.TryAddSingleton <IControllerFactoryProvider, ControllerFactoryProvider>();
            services.TryAddSingleton <IControllerActivatorProvider, ControllerActivatorProvider>();
            services.TryAddEnumerable(
                ServiceDescriptor.Transient <IControllerPropertyActivator, DefaultControllerPropertyActivator>());

            //
            // Action Invoker
            //
            // The IActionInvokerFactory is cachable
            services.TryAddSingleton <IActionInvokerFactory, ActionInvokerFactory>();
            services.TryAddEnumerable(
                ServiceDescriptor.Transient <IActionInvokerProvider, ControllerActionInvokerProvider>());

            // These are stateless
            services.TryAddSingleton <ControllerActionInvokerCache>();
            services.TryAddEnumerable(
                ServiceDescriptor.Singleton <IFilterProvider, DefaultFilterProvider>());

            //
            // Request body limit filters
            //
            services.TryAddTransient <RequestSizeLimitFilter>();
            services.TryAddTransient <DisableRequestSizeLimitFilter>();
            services.TryAddTransient <RequestFormLimitsFilter>();

            // Error description
            services.TryAddSingleton <IErrorDescriptionFactory, DefaultErrorDescriptorFactory>();

            //
            // ModelBinding, Validation
            //
            // The DefaultModelMetadataProvider does significant caching and should be a singleton.
            services.TryAddSingleton <IModelMetadataProvider, DefaultModelMetadataProvider>();
            services.TryAdd(ServiceDescriptor.Transient <ICompositeMetadataDetailsProvider>(s =>
            {
                var options = s.GetRequiredService <IOptions <MvcOptions> >().Value;
                return(new DefaultCompositeMetadataDetailsProvider(options.ModelMetadataDetailsProviders));
            }));
            services.TryAddSingleton <IModelBinderFactory, ModelBinderFactory>();
            services.TryAddSingleton <IObjectModelValidator>(s =>
            {
                var options          = s.GetRequiredService <IOptions <MvcOptions> >().Value;
                var metadataProvider = s.GetRequiredService <IModelMetadataProvider>();
                return(new DefaultObjectValidator(metadataProvider, options.ModelValidatorProviders));
            });
            services.TryAddSingleton <ClientValidatorCache>();
            services.TryAddSingleton <ParameterBinder>(s =>
            {
                var options                = s.GetRequiredService <IOptions <MvcOptions> >().Value;
                var loggerFactory          = s.GetRequiredService <ILoggerFactory>();
                var metadataProvider       = s.GetRequiredService <IModelMetadataProvider>();
                var modelBinderFactory     = s.GetRequiredService <IModelBinderFactory>();
                var modelValidatorProvider = new CompositeModelValidatorProvider(options.ModelValidatorProviders);
                return(new ParameterBinder(metadataProvider, modelBinderFactory, modelValidatorProvider, loggerFactory));
            });

            //
            // Random Infrastructure
            //
            services.TryAddSingleton <MvcMarkerService, MvcMarkerService>();
            services.TryAddSingleton <ITypeActivatorCache, TypeActivatorCache>();
            services.TryAddSingleton <IUrlHelperFactory, UrlHelperFactory>();
            services.TryAddSingleton <IHttpRequestStreamReaderFactory, MemoryPoolHttpRequestStreamReaderFactory>();
            services.TryAddSingleton <IHttpResponseStreamWriterFactory, MemoryPoolHttpResponseStreamWriterFactory>();
            services.TryAddSingleton(ArrayPool <byte> .Shared);
            services.TryAddSingleton(ArrayPool <char> .Shared);
            services.TryAddSingleton <OutputFormatterSelector, DefaultOutputFormatterSelector>();
            services.TryAddSingleton <IActionResultExecutor <ObjectResult>, ObjectResultExecutor>();
            services.TryAddSingleton <IActionResultExecutor <PhysicalFileResult>, PhysicalFileResultExecutor>();
            services.TryAddSingleton <IActionResultExecutor <VirtualFileResult>, VirtualFileResultExecutor>();
            services.TryAddSingleton <IActionResultExecutor <FileStreamResult>, FileStreamResultExecutor>();
            services.TryAddSingleton <IActionResultExecutor <FileContentResult>, FileContentResultExecutor>();
            services.TryAddSingleton <IActionResultExecutor <RedirectResult>, RedirectResultExecutor>();
            services.TryAddSingleton <IActionResultExecutor <LocalRedirectResult>, LocalRedirectResultExecutor>();
            services.TryAddSingleton <IActionResultExecutor <RedirectToActionResult>, RedirectToActionResultExecutor>();
            services.TryAddSingleton <IActionResultExecutor <RedirectToRouteResult>, RedirectToRouteResultExecutor>();
            services.TryAddSingleton <IActionResultExecutor <RedirectToPageResult>, RedirectToPageResultExecutor>();
            services.TryAddSingleton <IActionResultExecutor <ContentResult>, ContentResultExecutor>();

            //
            // Route Handlers
            //
            services.TryAddSingleton <MvcRouteHandler>();          // Only one per app
            services.TryAddTransient <MvcAttributeRouteHandler>(); // Many per app

            //
            // Middleware pipeline filter related
            //
            services.TryAddSingleton <MiddlewareFilterConfigurationProvider>();
            // This maintains a cache of middleware pipelines, so it needs to be a singleton
            services.TryAddSingleton <MiddlewareFilterBuilder>();
        }