我正在使用ASP.NET Core v1.1创建WebSocket服务器。这是我的Startup.cs的简化版本:

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

  // route of "/ws" requests
  app.Map("/ws", Map);
}


public void ConfigureServices(IServiceCollection services)
{
  // add the db service
  services.AddDbContext<ArticleContext>(
    opts => opts.UseNpgsql("MyConnectionString")
  );
}

private void Map(IApplicationBuilder app)
{
  app.UseWebSockets();
  app.Use(Acceptor);
}

private async Task Acceptor(HttpContext httpContext, Func<Task> next)
{
    // Handle the request using: httpContext.WebSockets.IsWebSocketRequest
    // ...
}


如您所见,我正在使用一个Acceptor任务来处理Web套接字请求。我还在ConfigureServices方法中添加了一个DbContext。

我没有使用任何MVC功能,因此未添加。但是我需要访问ArticleContext才能连接到我的数据库。

我看到的所有示例都使用了MVC软件包随附的Controller。在这样的控制器中,您可以使用构造函数依赖项注入来注入DBContext。

我不使用Controller,而是使用Acceptor方法,因此如何在其中获取ArticleContext实例?

我是否必须以某种方式编写MyAcceptor类并通过app.Use()将其添加到应用程序中,而不是使用app.Map来注入依赖项? ..只是一个猜测。

最佳答案

您将必须通过ArticleContext属性来解析HttpContext.RequestServices,如下所示:

private async Task Acceptor(HttpContext httpContext, Func<Task> next)
{
    var context = httpContext.RequestServices.GetRequiredService<ArticleContext>();
    // Handle the request using: httpContext.WebSockets.IsWebSocketRequest
    // ...
}


您还可以将Acceptor方法包装到其自己的类中。在这种情况下,您可以将ArticleContext注入到该AcceptorMiddleware类的构造函数中,但是在您的情况下似乎不需要。

关于c# - 在ASP.NET Core中创建具有依赖项的中间件功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41124925/

10-11 02:30