在ASP.NET Core中创建具有依赖性的中间件功能

时间:2016-12-13 15:36:10

标签: c# asp.net dependency-injection asp.net-core

我正在使用 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

我不使用控制器,而是使用 Acceptor 方法,那么如何在那里获取 ArticleContext 实例?

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

1 个答案:

答案 0 :(得分:3)

您必须按照以下方式解析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类的构造函数中,但在您的情况下似乎不需要这样做。