我正在使用 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 能够注入依赖项? ..只是一个猜测。
答案 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
类的构造函数中,但在您的情况下似乎不需要这样做。