System.Command Добавление сервисов.AddHostedService() в CommandHandlerC#

Место общения программистов C#
Ответить
Anonymous
 System.Command Добавление сервисов.AddHostedService() в CommandHandler

Сообщение Anonymous »

Сейчас я пытаюсь реализовать несколько рабочих сервисов. Было бы здорово, если бы я мог указать ему добавить службу на основе командной строки.
Допустим, я использую команду «Background --service1 --service2».
Я бы хотел, чтобы обработчик команд добавлял службы на хост. Допустим, я запускаю его без каких-либо аргументов, он просто запускается и сразу же останавливается.
Моя текущая реализация не будет работать из-за того, что объект служб всегда будет пусто, когда оно добавляется к размещенным службам, поскольку командная строка еще не была проанализирована.
Единственный способ, которым я мог себе это представить, - это разделить командную строку и хост строитель. Затем получаем результат из командной строки и используем его для сборки построителя. Но я ожидаю, что есть лучший способ сделать это, поскольку для System.CommandLine существует хост-пакет.
using System.CommandLine;
using System.CommandLine.Builder;
using System.CommandLine.Hosting;
using System.CommandLine.Parsing;

class Program
{
public static async Task Main(string[] args)
{

IServiceCollection commandServices = new ServiceCollection();
var parser = BuildCommandLine(ref commandServices)
.UseHost(_ => Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
{
ConfigureServices(context, services, commandServices);
AddLogging(context, services);
}),
hostBuilder =>
{
hostBuilder.UseCommandHandler();
})
.UseDefaults() // Ensure defaults are added last in the chain
.Build();

return await parser.InvokeAsync(args);

static CommandLineBuilder BuildCommandLine(ref IServiceCollection services)
{
// Create root command with description
var rootCommand = new RootCommand("This is your command-line app's root command.");

var backgroundCommand = new BackgroundCommand();
backgroundCommand.Handler = new BackgroundCommand.BackgroundCommandHandler(ref services);
rootCommand.AddCommand(backgroundCommand);

return new CommandLineBuilder(rootCommand);
}
}
}

public class BackgroundCommand : Command
{
public BackgroundCommand()
: base("Background", "Runs background workers based on options")
{
var service1Option= new Option(aliases: ["--service1"], description: "", getDefaultValue: () => false);
var service2Option= new Option(aliases: ["--service2"], description: "", getDefaultValue: () => false);

AddOption(service1Option);
AddOption(service2Option);
}
public class BackgroundCommandHandler : ICommandHandler
{
private readonly IServiceCollection _services;
public bool Service1 { get; set; } = false;
public bool Service2 { get; set; } = false;

public BackgroundCommandHandler(ref IServiceCollection services)
{
_services = services;
}

public int Invoke(InvocationContext context)
{
throw new NotImplementedException();
}

public async Task InvokeAsync(InvocationContext context)
{
if (Service1)
{
_services.AddHostedService();
}
if(Service2)
{
_services.AddHostedService();
}
return 0;
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... andhandler
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»