2017-01-09 6 views
0

ich einen Abschnitt in appsettings.json habe, die eine Liste von Bibliotheken und die Abhängigkeiten enthalten, und wie sie in verschiedener Ausführung konfigurieren environments.I'd möchte in der Lage sein zu überprüfen, dass die Bibliothek Sammlung umfasst alle Abhängigkeiten.Validieren Konfiguration in MVC-Core

, das einfach genug ist, mit einem wenig Rekursion zu tun. Aber ich kann nicht herausfinden, wie ich den Konfigurationsbindungsprozess übersteuern kann, damit ich die Validierung durchführen kann.

Die einzige Möglichkeit, die ich gefunden habe, ist eine rohe Sammlung der Bibliotheken basierend auf appconfig.json zu erstellen und dann einen Dienst zu erstellen, der die Sammlung validiert und verfügbar macht. Etwas wie:

public class RawLibraries : List<Library> 
{ 
} 

public class LibraryResolver 
{ 
    public LibraryResolver(IOptions<RawLibraries> rawLibs, ILogger logger) 
    { 
     // validate rawLibs and log errors 
    } 
    // ...implementation 
} 

services.Configure<RawLibraries>(Configuration.GetSection("Libraries")); 

services.AddSingleton<LibraryResolver, LibraryResolver>(); 

Aber das scheint gewunden. Gedanken zu einem besseren Ansatz?

Antwort

1

Warum die Autoren nicht zu folgen und Ihre eigene Erweiterungsmethode mit einem zusätzlichen Validierung schreiben?

Werfen Sie einen Blick hier. Dies ist der Quellcode services.Configure<> Methode:

namespace Microsoft.Extensions.DependencyInjection 
{ 
    /// <summary> 
    /// Extension methods for adding options services to the DI container. 
    /// </summary> 
    public static class OptionsServiceCollectionExtensions 
    { 
    ... 

    /// <summary> 
    /// Registers an action used to configure a particular type of options. 
    /// </summary> 
    /// <typeparam name="TOptions">The options type to be configured.</typeparam> 
    /// <param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> to add the services to.</param> 
    /// <param name="configureOptions">The action used to configure the options.</param> 
    /// <returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> so that additional calls can be chained.</returns> 
    public static IServiceCollection Configure<TOptions>(this IServiceCollection services, Action<TOptions> configureOptions) where TOptions : class 
    { 
     if (services == null) 
     throw new ArgumentNullException("services"); 
     if (configureOptions == null) 
     throw new ArgumentNullException("configureOptions"); 
     services.AddSingleton<IConfigureOptions<TOptions>>((IConfigureOptions<TOptions>) new ConfigureOptions<TOptions>(configureOptions)); 
     return services; 
    } 
    } 
} 

Wie Sie Configure<TOptions> Methode ist eine Erweiterung Methode sehen kann. Schreiben Sie einfach Ihre eigene, sagen wir ConfigureAndValidate<TOptions>() Extension-Methode, die richtige Überprüfung vor services.AddSingleton... Linie tun wird.

+0

Mein schlechtes! Ich gewöhne mich immer noch daran, unter die Haube schauen zu können, wie all das Zeug zusammengefügt ist. Danke, David! –