【问题标题】:Creating middleware function with dependency in ASP.NET Core在 ASP.NET Core 中创建具有依赖关系的中间件函数
【发布时间】:2016-12-13 15:36:09
【问题描述】:

我正在使用 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 将其添加到应用程序> 能够注入依赖项? .. 只是猜测。

【问题讨论】:

  • 您是否知道可以将所需的任何依赖项添加到 Configure 方法签名中,只要它们在 ConfigureServices 中注册,它们就会被注入到方法中?
  • 不,我不知道。可能有用,但不能解决我的问题。感谢您的评论。

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


【解决方案1】:

您必须从HttpContext.RequestServices 属性中解析ArticleContext,如下所示:

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 类的构造函数中,但在您的情况下似乎不需要。

【讨论】:

  • 似乎正是我搜索的内容。我想知道为什么我没有找到这样的例子。谢谢史蒂文!我会尽快尝试。
猜你喜欢
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
相关资源
最近更新 更多