Asp.net core 如何访问.NET Core 2.0 ConfigureServices()中的依赖项注入图

Asp.net core 如何访问.NET Core 2.0 ConfigureServices()中的依赖项注入图,asp.net-core,asp.net-core-mvc,asp.net-core-2.0,asp.net-core-webapi,Asp.net Core,Asp.net Core Mvc,Asp.net Core 2.0,Asp.net Core Webapi,我正在尝试从.NETCore1.1迁移到2.0,但在迁移JWT令牌配置时遇到了困难。我有一个提供JWTBeareOptions的接口/类,在.NET Core 2.0中,我无法访问我的DI图形对象(因为在2.0中,JWT是在ConfigureServices()函数中配置的)。我想保持Startup.cs文件中没有那么多配置JWT的代码行 有没有办法将JWTBeareOptions对象创建委托给通过DI创建的提供者?我想要像下面这样的东西: public virtual void Configu

我正在尝试从.NETCore1.1迁移到2.0,但在迁移JWT令牌配置时遇到了困难。我有一个提供JWTBeareOptions的接口/类,在.NET Core 2.0中,我无法访问我的DI图形对象(因为在2.0中,JWT是在ConfigureServices()函数中配置的)。我想保持Startup.cs文件中没有那么多配置JWT的代码行

有没有办法将JWTBeareOptions对象创建委托给通过DI创建的提供者?我想要像下面这样的东西:

public virtual void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication()
            .AddJwtBearer(MyAuthicationScheme.JwtAuthName, options =>
            {
                myInjectedInstance.SetJwtBearOptions(options, Configuration);
            })
    }

在微软的文档中找到了答案。在ConfigureServices调用期间无法访问DI对象:

在microsoft的文档中找到了答案。在ConfigureServices调用期间无法访问DI对象:

@flodin 对于AddJwtBearer,我遇到了同样的问题,通过插入OnMessageRecieved事件,有一种很难访问HttpContext的方法

   jwt.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents()
                {
                    OnMessageReceived = context =>
                    {
                        // setting the issuer validator delegate here instead of in the jwt.TokenValidationParameters
                        // allows for accessing the HttpContext items and DI container
                        context.Options.TokenValidationParameters.IssuerValidator = (issuer, token, parameters) =>
                        {
                            // di in callbacks!
                            var test = context.HttpContext.RequestServices.GetService<ITenant>();

                        return Task.CompletedTask;
                    }
jwt.Events=new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents()
{
OnMessageReceived=上下文=>
{
//在此处而不是在jwt.TokenValidationParameters中设置颁发者验证程序委托
//允许访问HttpContext项和DI容器
context.Options.TokenValidationParameters.IssuerValidator=(发卡机构、令牌、参数)=>
{
//回拨中的di!
var test=context.HttpContext.RequestServices.GetService();
返回Task.CompletedTask;
}
@flodin 对于AddJwtBearer,我遇到了同样的问题,通过插入OnMessageRecieved事件,有一种很难访问HttpContext的方法

   jwt.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents()
                {
                    OnMessageReceived = context =>
                    {
                        // setting the issuer validator delegate here instead of in the jwt.TokenValidationParameters
                        // allows for accessing the HttpContext items and DI container
                        context.Options.TokenValidationParameters.IssuerValidator = (issuer, token, parameters) =>
                        {
                            // di in callbacks!
                            var test = context.HttpContext.RequestServices.GetService<ITenant>();

                        return Task.CompletedTask;
                    }
jwt.Events=new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents()
{
OnMessageReceived=上下文=>
{
//在此处而不是在jwt.TokenValidationParameters中设置颁发者验证程序委托
//允许访问HttpContext项和DI容器
context.Options.TokenValidationParameters.IssuerValidator=(发卡机构、令牌、参数)=>
{
//回拨中的di!
var test=context.HttpContext.RequestServices.GetService();
返回Task.CompletedTask;
}

您的意思是仅仅创建一个扩展方法吗?e.x.是否可以注入自定义服务的构造函数?您的意思是仅仅创建一个扩展方法吗?e.x.是否可以注入自定义服务的构造函数?我认为这只是部分正确。由于DI图是在ConfigureServices中初始化的,因此这是合乎逻辑的无法在那里访问它。但是,那里的许多配置调用都会使用可能是lambda函数的回调。这些回调通常会在DI图完成后依次调用。在许多情况下,您可以使用IServiceProvider作为这些回调的参数。在某些情况下,例如AddJwtBearer(),您不能。这对我来说是一个严重的问题。我认为这只是部分正确。由于DI图正在ConfigureServices中初始化,因此在那里无法访问它是合乎逻辑的。但是,那里的许多配置调用都会进行回调,可能是lambda函数。这些回调通常会在DI图被调用后依次调用pleted。在许多情况下,您可以将IServiceProvider作为这些回调的参数。在某些情况下,例如AddJwtBearer(),您不能。这对我来说是一个严重的问题。