forked from ServiceStack/ServiceStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathValidationFeature.cs
More file actions
64 lines (58 loc) · 2.17 KB
/
Copy pathValidationFeature.cs
File metadata and controls
64 lines (58 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Funq;
using ServiceStack.FluentValidation;
using ServiceStack.ServiceHost;
using ServiceStack.WebHost.Endpoints;
using ServiceStack.Text;
namespace ServiceStack.ServiceInterface.Validation
{
public class ValidationFeature : IPlugin
{
public static bool Enabled { private set; get; }
/// <summary>
/// Activate the validation mechanism, so every request DTO with an existing validator
/// will be validated.
/// </summary>
/// <param name="appHost">The app host</param>
public void Register(IAppHost appHost)
{
Enabled = true;
var filter = new ValidationFilters();
appHost.RequestFilters.Add(filter.RequestFilter);
}
}
public static class ValidationExtensions
{
/// <summary>
/// Auto-scans the provided assemblies for a <see cref="IValidator"/>
/// and registers it in the provided IoC container.
/// </summary>
/// <param name="container">The IoC container</param>
/// <param name="assemblies">The assemblies to scan for a validator</param>
public static void RegisterValidators(this Container container, params Assembly[] assemblies)
{
foreach (var assembly in assemblies)
{
foreach (var validator in assembly.GetTypes()
.Where(t => t.IsOrHasGenericInterfaceTypeOf(typeof(IValidator<>))))
{
RegisterValidator(container, validator);
}
}
}
public static void RegisterValidator(this Container container, Type validator)
{
var baseType = validator.BaseType;
while (!baseType.IsGenericType)
{
baseType = baseType.BaseType;
}
var dtoType = baseType.GetGenericArguments()[0];
var validatorType = typeof(IValidator<>).MakeGenericType(dtoType);
container.RegisterAutoWiredType(validator, validatorType);
}
}
}