-
Notifications
You must be signed in to change notification settings - Fork 20
/
ValidatorProvider.cs
62 lines (52 loc) · 2.53 KB
/
ValidatorProvider.cs
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
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace NuGet.Services.Validation.Orchestrator
{
public class ValidatorProvider : IValidatorProvider
{
private readonly IServiceProvider _serviceProvider;
private readonly ILogger<ValidatorProvider> _logger;
private readonly Dictionary<string, Type> _validatorTypes;
public ValidatorProvider(IServiceProvider serviceProvider, ILogger<ValidatorProvider> logger)
{
_serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
using (_logger.BeginScope("Enumerating all IValidator implementations"))
{
_logger.LogTrace("Before enumeration");
IEnumerable<Type> candidateTypes = GetCandidateTypes(Assembly.GetCallingAssembly());
_validatorTypes = candidateTypes
.Where(type => typeof(IValidator).IsAssignableFrom(type) && type != typeof(IValidator))
.ToDictionary(type => type.Name);
_logger.LogTrace("After enumeration, got {NumImplementations} implementations: {TypeNames}",
_validatorTypes.Count,
_validatorTypes.Keys);
}
}
public IValidator GetValidator(string validatorName)
{
validatorName = validatorName ?? throw new ArgumentNullException(nameof(validatorName));
if (_validatorTypes.TryGetValue(validatorName, out Type validatorType))
{
return (IValidator)_serviceProvider.GetRequiredService(validatorType);
}
throw new ArgumentException($"Unknown validator name: {validatorName}", nameof(validatorName));
}
private static IEnumerable<Type> GetCandidateTypes(Assembly callingAssembly)
{
var executingAssembly = Assembly.GetExecutingAssembly();
IEnumerable<Type> candidateTypes = executingAssembly.GetTypes();
if (callingAssembly != executingAssembly)
{
candidateTypes = candidateTypes.Concat(callingAssembly.GetTypes());
}
return candidateTypes;
}
}
}