C# DI Регистрация динамических настроек перед созданием экземпляраC#

Место общения программистов C#
Ответить
Anonymous
 C# DI Регистрация динамических настроек перед созданием экземпляра

Сообщение Anonymous »

Я ищу способ реализовать динамическое создание регистрации моделей на основе набора значений, которые я получаю из базы данных (у меня есть код для этого), а затем регистрирую их в конвейере DI (с чем мне нужна помощь) . Надеюсь, приведенный ниже псевдокод поможет показать то, что я ищу. Каждый экземпляр IIntegration имеет свой собственный набор необходимых настроек, и они могут даже меняться между несколькими экземплярами одной и той же интеграции. Я могу успешно извлечь информацию об интеграции из базы данных и создать новый экземпляр этой интеграции, используя имя службы с ключами, но я не знаю, как внедрить свои настройки перед созданием этого экземпляра.
Я не могу просто включить свой список настроек в вызов метода ExecuteAsync, поскольку они могут потребоваться другим зависимым службам для этой интеграции (MyIntegration1DependentService в данном случае). Любая помощь приветствуется.
Надеюсь, это очень упрощенная версия моего вопроса: я могу создать экземпляр Integration1Settings из IEnumerable. Затем я хотел бы внедрить это в контейнер DI, чтобы при вызове GetRequiredKeyedService экземпляр был доступен для MyIntegration1 и MyIntegration1DependentService
public class MyIntegration {
public string IntegrationName { get; set; } = string.Empty;
public IEnumerable Settings { get; set; } = [];
}

public class MySetting()
{
public string SettingName { get; set; } = string.Empty;
public string SettingType { get; set; } = string.Empty;
public string SettingValue { get; set; } = string.Empty;
}

public class Integration1Settings {
public string Setting1 { get; set; } = string.Empty;
public string Settting2 { get; set; } = string.Empty;
}

public class Integration2Settings {
public string Setting3 { get; set; } = string.Empty;
public string Settting4 { get; set; } = string.Empty;
public string Settting5 { get; set; } = string.Empty;
public string Settting6 { get; set; } = string.Empty;
public string Settting7 { get; set; } = string.Empty;
}

public class MyIntegrationFactory {
private readonly IServiceProvider _serviceProvider;

public MyIntegrationFactory(IServiceProvider serviceProvider) {
_serviceProvider = serviceProvider;
}

public async Task GetIntegrationAsync(Invoice invoice) {
var integrationInstance = await GetIntegrationInstanceAsync(invoice);

// Not instance configured
if(integrationInstance is null) {
return null;
}

// Need to do something here to inject settings collection into pipeline prior to getting service
???

// Generate new instance using the name
var instance = _serviceProvider.GetRequiredKeyedService(integrationInstance.IntegrationName);

return instance;
}

private async Task GetIntegrationInstanceAsync(Invoice invoice) {
// ... Pull from DB
}
}

public interface IIntegration {
Task ExecuteAsync();
}

public class MyIntegration1 : IIntegration {
private readonly Integration1Settings _settings;

public MyIntegration1(Integration1Settings settings) {
_settings = settings;
}
// ... Other Code ...
}

public class MyIntegration1DependentService {
private readonly Integration1Settings _settings;

public MyIntegration1DependentService(Integration1Settings settings) {
_settings = settings;
}

// ... Other Code
}

public class MyIntegration2 : IIntegration {
private readonly Integration2Settings _settings;

public MyIntegration2(Integration2Settings settings) {
_settings = settings;
}
}


Подробнее здесь: https://stackoverflow.com/questions/786 ... g-instance
Ответить

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

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

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

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

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