Зарегистрируйте класс в IServiceCollection после запуска - PullRequest
0 голосов
/ 27 мая 2020

В моем приложении у меня есть несколько сервисов, которые я хочу зарегистрировать после запуска.

LateClass:

public LateClass(IServiceCollection col)
{
    col.AddTransient<IEventHandler, JsonPackageUpdated>();
}

И, конечно же, зарегистрировать сам LateClass:

 public void ConfigureServices(IServiceCollection services)
 {
     col.AddTransient<LateClass>();
 }

Но IServiceCollection нарушит работу моего приложения, и я получил исключение, которое не могу разрешить.

1 Ответ

1 голос
/ 27 мая 2020

Отвечая на вопрос OP в комментариях, как следует обрабатывать конфигурацию Dynami c.

Вы можете сделать свой ConfigurationService настолько сложным, насколько хотите (вводить другие службы, в которые было введено что-то еще), пока он не станет циклической зависимостью .

using Microsoft.Extensions.DependencyInjection;
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var collection = new ServiceCollection();

            collection.AddTransient<ConfigurationService>();
            collection.AddTransient<EventProcessService>();


            var serviceProvider = collection.BuildServiceProvider();

            var eventService = serviceProvider.GetService<EventProcessService>();

            eventService.ProcessEvent(0);
        }
    }

    public class ConfigurationService
    {
        public ConfigurationService(
                // you could use whatever configuration provider you have: db context for example
            )
        {
        }

        public string GetSettingBasedOnEventType(int eventType)
        {
            switch (eventType)
            {
                case 0:
                    return "Some setting value";
                case 1:
                    return "Some other setting value";
                default:
                    return "Not found";
            }
        }
    }

    public class EventProcessService
    {
        private readonly ConfigurationService configurationService;

        public EventProcessService(ConfigurationService configurationService)
        {
            this.configurationService = configurationService;
        }

        public void ProcessEvent(int eventType)
        {
            var settingForEvent = configurationService.GetSettingBasedOnEventType(eventType);

            // process event with your setting
        }
    }
}
...