Я ищу способ реализовать динамическое создание регистрации моделей на основе набора значений, которые я получаю из базы данных (у меня есть код для этого), а затем регистрирую их в конвейере DI (с чем мне нужна помощь) . Надеюсь, приведенное ниже поможет показать то, что я ищу. Каждый экземпляр IIntegration имеет свой собственный набор необходимых настроек, и они могут даже меняться между несколькими экземплярами одной и той же интеграции. Я могу успешно извлечь информацию об интеграции из базы данных и создать новый экземпляр этой интеграции, используя имя службы с ключами, но я не знаю, как внедрить свои настройки перед созданием этого экземпляра.
Я не могу просто включить свой список настроек в вызов метода ExecuteAsync, поскольку они могут потребоваться другим зависимым службам для этой интеграции (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 RateVerifierFactory(IServiceProvider serviceProvider) {
_serviceProvider = serviceProvider;
}
public async Task GetVerifierAsync(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