В C#, как вводить зависимую службу с именованными параметрами на основе услуги потребителей и PARAM?C#

Место общения программистов C#
Ответить
Anonymous
 В C#, как вводить зависимую службу с именованными параметрами на основе услуги потребителей и PARAM?

Сообщение Anonymous »

c# и .net 8, с использованием .net di Framework и ioptions .
У меня есть класс опций:

Код: Выделить всё

public class MyOptions
{
public string Name { get; set; }
}
Тогда у меня есть класс службы, которым нужен экземпляр myoptions injected:

Код: Выделить всё

public interface IServiceWithOptions { /*...*/ }

public class ServiceWithOptions : IServiceWithOptions
{
public ServiceWithOptions(IOptions options)
{
// ...
}
}
Теперь есть два других сервиса, которые потребляют Servicewithoptions , где один из них действительно нуждается в двух экземплярах, но с разными параметрами:

Код: Выделить всё

public interface IFirstService { /*...*/ }

public class FirstService : IFirstService
{
public FirstService(IServiceWithOptions svcWithOpts)
{
// ...
}
}

public interface ISecondService { /*...*/ }

public class SecondService : ISecondService
{
public SecondService(
IServiceWithOptions svcWithOptsPrimary,
IServiceWithOptions svcWithOptsSecondary)
{
// ...
}
}
Я бы хотел, чтобы приложения.

Код: Выделить всё

{
"MyOptions": {
"First": {
"Name": "The first one"
},
"SecondPrimary": {
"Name": "The second one, primary instance"
},
"SecondSecondary": {
"Name": "The second one, secondary instance"
}
}
}
Я думаю, что я выяснил, как зарегистрировать/связать экземпляры myoptions в качестве именных параметров для разделов конфигурации.
Но как мне зарегистрировать службы для получения Servicewithoptions , используя правильный именованный экземпляр myoptions в каждом случае? Singletons, включая каждый «вариант» Servicewithoptions , то есть это было бы просто отлично с одним синглтоном этой службы для каждого Myoptions .
Регистрация услуг (не мой код) выглядит примерно так («сглаженная» для простоты):
var services = new ServiceCollection();
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile($"appsettings.json", optional: false, reloadOnChange: false)
.AddUserSecrets(typeof(Initializer).Assembly);
var configuration = builder.Build();
services.AddOptions();
services.AddOptions("First").Bind(configuration.GetSection("MyOptions:First"));
services.AddOptions("SecondPrimary").Bind(configuration.GetSection("MyOptions:SecondPrimary"));
services.AddOptions("SecondSecondary").Bind(configuration.GetSection("MyOptions:SecondSecondary"));
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();

Я не (пока) не думал о том, чтобы сделать что-то не-синглтон.


Подробнее здесь: https://stackoverflow.com/questions/797 ... sumer-serv
Ответить

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

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

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

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

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