Quartznet: Autoriser la configuration personnalisée via le modèle Options

Créé le 10 sept. 2020  ·  9Commentaires  ·  Source: quartznet/quartznet

Votre demande de fonctionnalité est-elle liée à un problème ?
"Je suis toujours frustré quand" je ne peux pas accéder IServiceProvider dans l'action configure de AddQuartz .

Décrivez la solution que vous souhaitez
AddQuartz devrait avoir une surcharge comme AddQuartz(this IServiceCollection serviceCollection, Action<IServiceProvider, IServiceCollectionQuartzConfigurator>? configure = null) similaire à par exemple. AddContext .

Décrivez les alternatives que vous avez envisagées
Alternativement, Quartz pourrait exposer une interface d'options, et je pourrais configurer avec par exemple. IConfigureOptions<QuartzOptions> . Par exemple AddCors fait cela avec CorsOptions . On peut utiliser IConfigureOptions<CorsOptions> pour configurer cors et accéder IServiceProvider .

Comme solution de contournement, je peux amorcer manuellement les dépendances auxquelles j'aimerais accéder dans AddQuartz .

Contexte supplémentaire
Mes cas d'utilisation sont similaires à ceux d'Andrew Lock décrits dans cet article de blog . J'espère que vous y trouverez de l'inspiration.

Merci beaucoup!

EDIT : Pour être clair, il s'agit d'une amélioration mineure de l'interface de configuration car des commentaires ont été demandés .

Tous les 9 commentaires

Je pense que la surcharge que vous avez décrite AddQuartz(this IServiceCollection serviceCollection, Action<IServiceProvider, IServiceCollectionQuartzConfigurator>? configure = null) a beaucoup de sens. Souhaitez-vous proposer un PR pour en ajouter un ?

Sur la deuxième note, s'il y a quelque chose qui est difficile à configurer dans Quartz via l'API de configuration fournie, il peut également être judicieux d'y ajouter des assistants typés, mais pas sûr de votre cas d'utilisation.

J'ai bien peur de ne pas connaître assez Quartz pour créer un PR avec une estimation de travail raisonnable. Donc, désolé, pas cette fois.

J'ai accidentellement lié un mauvais problème concernant les commentaires, c'est corrigé maintenant.

Tout va bien, je vais voir ce que je peux faire 👍

Pour clarifier, voici un cas d'utilisation simple avec des paramètres fortement typés :

.AddQuartz((serviceProvider, configurator) => {
    var cron = serviceProvider
        .GetRequiredService<IOptions<MyOptions>>()
        .Value
        .Cron;
    configurator.AddTrigger(trigger => trigger
        .ForJob("MyJob")
        .WithCronSchedule(cron));
});

Pour la configuration de planification basée sur des fichiers et actualisée automatiquement, il existe également l'option XML, mais vous l'avez probablement déjà vérifiée également. Mais je vois le cas d'utilisation pour récupérer des choses à partir de sa propre infrastructure de configuration/service.

Mon 2 cents : ajouter une telle surcharge sera très compliqué, car le IServiceProvider n'est pas disponible à partir de ConfigureServices (sauf si vous appelez services.BuildServiceProvider() pour créer une DI temporaire, mais c'est une pratique déconseillée, qui devrait même signaler une alerte dans les versions récentes de VS/.NET Core).

Le cas d'utilisation décrit dans le dernier article de @ljani serait facilement résolu si Quartz.NET utilisait Microsoft.Extensions.Options (comme suggéré dans l'OP et discuté récemment dans le référentiel OpenIddict). Dans ce cas, le faire en ligne devrait être aussi simple que :

services.AddOptions<QuartzOptions>()
    .Configure<IOptions<MyOptions>>((options, dep) =>
    {
        options.AddTrigger(trigger => trigger
            .ForJob("MyJob")
            .WithCronSchedule(dep.Value.Cron));
    });

Merci @kevinchalet d'être intervenu ! J'ai jeté un coup d'œil plus tôt et ce fournisseur de services semblait en effet assez difficile à atteindre. Maintenant, je dois étudier le modèle d'options 🙂

J'ai donc effectué les modifications nécessaires pour réaliser l'idée proposée par @kevinchalet avec PR https://github.com/quartznet/quartznet/pull/978 . Espérons que cela ne soit plus conforme aux attentes du modèle d'options et permette de faire la configuration.

@lahma a l'air bien pour mes besoins, merci !

Cette page vous a été utile?
0 / 5 - 0 notes