Поздняя регистрация сервисов с помощью основного веб-интерфейса asp.net - PullRequest
2 голосов
/ 28 октября 2019

У меня есть реализация Web API в ASP.NET Core, и я хотел бы использовать включенное внедрение зависимостей. Кроме того, у меня есть сборки с поздним связыванием, где мне нужно загрузить Type и создать его экземпляр, который может иметь зависимости от основного приложения.

Я пытаюсь загрузить динамические ресурсы из сборок, которых я не знаюво время запуска. Поэтому я использую Assembly.Load("name") и ищу фабричные типы, которые дают мне реализацию ассемблера для чтения ресурсов. Итак, я знаю тип, который мне нужен для создания экземпляра, но я не могу зарегистрировать его в IServiceCollection и, следовательно, не могу создать экземпляры с помощью ServiceProvider.

Поэтому я попытался зарегистрировать мои найденные типы в IServiceCollection, которая была предоставленапо рамкам. Для чего я зарегистрировал ServiceCollection внутри себя.

// Within Startup.cs
public void ConfigureServices(IServiceCollection services)
{
  services.AddSingleton<IServiceCollection>(services);
}

// A service to register new dependencies later on
public class ServiceRegistrationService : IServiceRegistrationService
{    
  public IServiceCollection Services { get; }
  public IServiceRegistrationService RegisterSelfTransient(Type type)
  {
    Services.AddTransient(type);
    return this;
  }
}

После вызова этого метода, например:

ServiceRegistrationService.RegisterSelfTransient(typeof(MyConcreteType));

Я бы ожидал, что IServiceProvider разрешит новый экземпляр моего типа. Можно ли зарегистрировать услуги после выхода из метода ConfigureServices(IServiceCollection services)?

...