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