1

我正在尝试从 aspnet 核心的 Startup.cs 中的 Configure 调用中访问我的一项服务。我正在执行以下操作,但是我收到以下错误“没有注册类型'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 中工作,则不会影响任何内容

编辑:添加以显示 userService 的注册。在我忽略的 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);
}
4

1 回答 1

1

请仔细阅读 ASP.NET Core 的Simple Injector 集成页面,因为 Simple Injector 与 ASP.NET Core 的集成非常不同,因为 Microsoft 记录了 DI 容器应如何集成。Simple Injector 文档指出:

请注意,在 ASP.NET Core 中集成 Simple Injector 时,请不要按照 Microsoft 文档的建议替换 ASP.NET 的内置容器。Simple Injector 的做法是使用 Simple Injector 构建应用程序组件的对象图,并让内置容器构建框架和第三方组件

这意味着,由于内置容器仍然存在,使用app.ApplicationServices.GetRequiredService<T>()在 Simple Injector 中注册时使用解析组件将不起作用。在这种情况下,您正在询问内置容器并且它不知道这些注册的存在。

相反,您应该使用 Simple Injector 解析您的类型:

container.GetInstance<UserService>()
于 2019-04-18T14:23:42.767 回答