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); }
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); }
public CompositeModelValidatorProviderTests() { provider1 = new Mock <ModelValidatorProvider>(); provider2 = new Mock <ModelValidatorProvider>(); compositeProvider = new CompositeModelValidatorProvider(provider1.Object, provider2.Object); }
/// <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); }
/// <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); }
/// <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); }
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>(); }