Megosztás a következőn keresztül:


Függőséginjektálás konfigurálása a következőben: System.CommandLine

Fontos

System.CommandLine jelenleg előzetes verzióban érhető el, és ez a dokumentáció a 2.0-s bétaverzió 4-es verziójához készült. Egyes információk az előzetes termékre vonatkoznak, amelyek a kiadás előtt jelentősen módosíthatók. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.

Egyéni kötőanyag használatával egyéni típusokat szúrhat be egy parancskezelőbe.

A kezelőspecifikus függőséginjektálást (DI) a következő okokból javasoljuk:

  • A parancssori alkalmazások gyakran rövid élettartamú folyamatok, amelyek indítási költségei észrevehető hatással lehetnek a teljesítményre. A teljesítmény optimalizálása különösen fontos, ha a lapkiegészítéseket ki kell számítani. A parancssori alkalmazások ellentétben állnak a webes és a grafikus felhasználói felület alkalmazásaival, amelyek általában viszonylag hosszú élettartamú folyamatok. A szükségtelen indítási idő nem megfelelő a rövid élettartamú folyamatokhoz.
  • Több alparancsot tartalmazó parancssori alkalmazás futtatásakor a rendszer csak az egyik alparancsot hajtja végre. Ha egy alkalmazás olyan alparancsokhoz konfigurál függőségeket, amelyek nem futnak, szükségtelenül csökkenti a teljesítményt.

A DI konfigurálásához hozzon létre egy osztályt, amely abból a felületből BinderBase<T>T származik, amelyhez példányt szeretne injektálni. A metódus felülbírálásában GetBoundValue kérje le és adja vissza az injektálni kívánt példányt. Az alábbi példa beszúrja az alapértelmezett naplózó implementációt a következőhöz ILogger:

public class MyCustomBinder : BinderBase<ILogger>
{
    protected override ILogger GetBoundValue(
        BindingContext bindingContext) => GetLogger(bindingContext);

    ILogger GetLogger(BindingContext bindingContext)
    {
        using ILoggerFactory loggerFactory = LoggerFactory.Create(
            builder => builder.AddConsole());
        ILogger logger = loggerFactory.CreateLogger("LoggerCategory");
        return logger;
    }
}

A metódus meghívásakor SetHandler adja át a lambdának az injektált osztály egy példányát, és adja át a binder osztály egy példányát a szolgáltatások listájában:

rootCommand.SetHandler(async (fileOptionValue, logger) =>
    {
        await DoRootCommand(fileOptionValue!, logger);
    },
    fileOption, new MyCustomBinder());

Az alábbi kód egy teljes program, amely az előző példákat tartalmazza:

using System.CommandLine;
using System.CommandLine.Binding;
using Microsoft.Extensions.Logging;

class Program
{
    static async Task Main(string[] args)
    {
        var fileOption = new Option<FileInfo?>(
              name: "--file",
              description: "An option whose argument is parsed as a FileInfo");

        var rootCommand = new RootCommand("Dependency Injection sample");
        rootCommand.Add(fileOption);

        rootCommand.SetHandler(async (fileOptionValue, logger) =>
            {
                await DoRootCommand(fileOptionValue!, logger);
            },
            fileOption, new MyCustomBinder());

        await rootCommand.InvokeAsync("--file scl.runtimeconfig.json");
    }

    public static async Task DoRootCommand(FileInfo aFile, ILogger logger)
    {
        Console.WriteLine($"File = {aFile?.FullName}");
        logger.LogCritical("Test message");
        await Task.Delay(1000);
    }

    public class MyCustomBinder : BinderBase<ILogger>
    {
        protected override ILogger GetBoundValue(
            BindingContext bindingContext) => GetLogger(bindingContext);

        ILogger GetLogger(BindingContext bindingContext)
        {
            using ILoggerFactory loggerFactory = LoggerFactory.Create(
                builder => builder.AddConsole());
            ILogger logger = loggerFactory.CreateLogger("LoggerCategory");
            return logger;
        }
    }
}

Lásd még

System.CommandLine Áttekintés