'da bağımlılık eklemeyi yapılandırma System.CommandLine

Önemli

System.CommandLine şu anda ÖNİzLEME aşamasındadır ve bu belgeler 2.0 beta 4 sürümüne yöneliktir. Bazı bilgiler, yayımlanmadan önce önemli ölçüde değiştirilebilen yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Bir komut işleyicisine özel türler eklemek için özel bir bağlayıcı kullanın.

aşağıdaki nedenlerle işleyiciye özgü bağımlılık ekleme (DI) önerilir:

  • Komut satırı uygulamaları genellikle başlangıç maliyetinin performans üzerinde belirgin bir etkiye sahip olabileceği kısa süreli işlemlerdir. Sekme tamamlamalarının hesaplanması gerektiğinde performansı iyileştirmek özellikle önemlidir. Komut satırı uygulamaları, nispeten uzun süreli işlemler olma eğiliminde olan Web ve GUI uygulamalarından farklı bir uygulamadır. Kısa süreli işlemler için gereksiz başlangıç süresi uygun değildir.
  • Birden çok alt komutu olan bir komut satırı uygulaması çalıştırıldığında, bu alt komutlardan yalnızca biri yürütülür. Bir uygulama, çalışmayan alt komutlar için bağımlılıkları yapılandırırsa, gerek duymadan performansı düşürür.

DI'yi yapılandırmak için, örneği eklemek istediğiniz arabirimin bulunduğu konumdan BinderBase<T>T türetilen bir sınıf oluşturun. Yöntemi geçersiz kılma bölümünde GetBoundValue , eklemek istediğiniz örneği alın ve döndürin. Aşağıdaki örnekte için ILoggervarsayılan günlükçü uygulaması eklenir:

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;
    }
}

yöntemini çağırırken SetHandler lambda'ya eklenen sınıfın bir örneğini geçirin ve hizmetler listesinde bağlayıcı sınıfınızın bir örneğini geçirin:

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

Aşağıdaki kod, önceki örnekleri içeren eksiksiz bir programdır:

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;
        }
    }
}

Ayrıca bkz.

System.CommandLine Genel bakış