GetRequiredService изнутри Configure - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь получить доступ к одной из моих служб из вызова Configure в Startup.cs в ядре aspnet. Однако я делаю следующее, но получаю следующую ошибку: «Не зарегистрирован сервис для типа UserService». Теперь я знаю, что он зарегистрирован, потому что я могу использовать его в контроллере, поэтому я просто делаю что-то не так, когда дело касается его использования здесь. Пожалуйста, кто-нибудь может указать мне правильное направление. Я рад, что выбрал другой подход к настройке Tus, если есть лучший способ добиться того, чего я хочу.

      var userService = app.ApplicationServices.GetRequiredService<UserService>();
      userService.UpdateProfileImage(file.Id);

Ниже я хочу использовать

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{

... Other stuff here...

  app.InitializeSimpleInjector(container, Configuration);

  container.Verify();


  app.UseTus(httpContext =>
  {

    var restaurantEndpoint = "/restaurant/images";
    var userEndpoint = "/account/images";
    var endPoint = "/blank/images";

    if (httpContext.Request.Path.StartsWithSegments(new PathString(restaurantEndpoint)))
    {
      endPoint = restaurantEndpoint;
    }

    if (httpContext.Request.Path.StartsWithSegments(new PathString(userEndpoint)))
    {
      endPoint = userEndpoint;
    }

    return new BranchTusConfiguration
    {
      Store = new TusDiskStore(@"C:\tusfiles\"),
      UrlPath = endPoint,
      Events = new Events
      {
        OnBeforeCreateAsync = ctx =>
        {
          return Task.CompletedTask;
        },

        OnCreateCompleteAsync = ctx =>
        {
          return Task.CompletedTask;
        },

        OnFileCompleteAsync = async ctx =>
        {
          var file = await ( (ITusReadableStore)ctx.Store ).GetFileAsync(ctx.FileId, ctx.CancellationToken);

          var userService = app.ApplicationServices.GetRequiredService<UserService>();
          userService.UpdateProfileImage(file.Id);
        }
      }
    };

  });

... More stuff here...

};

Моя конечная цель - переместить это в расширение IApplicationBuilder, чтобы очистить мой startup.cs, но это ни на что не должно повлиять, если оно работает из startup.cs

Редактировать: Добавить, чтобы показать регистрацию пользователя. В методе InitializeSimpleInjector, который я пропустил, есть множество других вещей, которые регистрируются и пересекаются. можете добавить все, если нужно ..

 public static void InitializeSimpleInjector(this IApplicationBuilder app, Container container, IConfigurationRoot configuration)
{

  // Add application presentation components:
  container.RegisterMvcControllers(app);
  container.RegisterMvcViewComponents(app);

  container.Register<UserService>(Lifestyle.Scoped);

  container.CrossWire<IServiceProvider>(app);
  container.Register<IServiceCollection, ServiceCollection>(Lifestyle.Scoped);
}

1 Ответ

1 голос
/ 18 апреля 2019

Пожалуйста, внимательно прочитайте страницу интеграции Simple Injector для ASP.NET Core , так как Simple Injector очень по-разному интегрируется с ASP.NET Core, так как Microsoft задокументировала, как должны интегрироваться DI-контейнеры.Документация Simple Injector гласит:

Обратите внимание, что при интеграции Simple Injector в ASP.NET Core вы не заменяете встроенный контейнер ASP.NET, как рекомендовано в документации Microsoft.Практика использования Simple Injector состоит в том, чтобы использовать Simple Injector для построения графов объектов компонентов вашего приложения и позволить встроенной структуре сборки контейнера и сторонним компонентам

Что это означает, так каквстроенный контейнер по-прежнему на месте, разрешение компонентов с использованием app.ApplicationServices.GetRequiredService<T>(), в то время как они зарегистрированы в Simple Injector, не будет работать.В этом случае вы запрашиваете встроенный контейнер, и он не знает о существовании этих регистраций.

Вместо этого вы должны разрешить свой тип (типы) с помощью Simple Injector:

container.GetInstance<UserService>()
...