Сейчас я пытаюсь реализовать несколько рабочих сервисов. Было бы здорово, если бы я мог указать ему добавить службу на основе командной строки.
Допустим, я использую команду «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
System.Command Добавление сервисов.AddHostedService() в CommandHandler ⇐ C#
Место общения программистов C#
1730118126
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;
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79133373/system-commanline-adding-services-usehostedservicet-to-commandhandler[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия