我正在练习学习更多关于ASP中的依赖注入和中间件的知识.NET Core和我面临着一个无法解决的问题,因此需要StackOverflow的其他成员的帮助.

在我的项目中,我试图创建一个中间件,将一些初始数据与运行时收集的另一个数据结合起来.

我有下面的类作为初始数据

public class A
{
    public string Name { get; set; }
    public string Description { get; set; }
}

我为依赖注入创建了以下类

namespace Microsoft.Extensions.DependencyInjection
{
    public static class MiddlewareInitialDataExtension
    {
        public static IServiceCollection AddInitialData(this IServiceCollection services, Action<A> data)
        {
            A a = new A();
            data(a);
            return services.AddSingleton<A>(a);
        }    
    }
}

Startup.cs文件中,我将其注入如下:

public void ConfigureServices(IServiceCollection services)
{
    services.AddInitialData(d =>
    {
        d.Name = "Some name";
        d.Description = "Some description";
    });
}

我还编写了如下中间件:

public class MyMiddleware
{
    private readonly RequestDelegate _next;

    public MyMiddleware(RequestDelegate next)
    {
        this._next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        await this._next(context);
    }
}

并在Starup.cs文件中注册了我的中间件,如下所示:

public void Configure(IApplicationBuilder app, IHostEnvironment env)
{
    app.UseMiddleware(typeof(MyMiddleware));
}

此时,我需要访问从A类实例化并在调用Invoke(HttpContext context)方法时注入应用程序的对象.

到目前为止,我发现了一些以不同方式使用依赖注入的示例,比如将对象(从类a)传递给中间件的构造函数,但我希望在编写对象时读取其值设置.

推荐答案

在startup中注册了A的实例后,可以将其添加到中间件构造函数的签名中:

private readonly A _a;

public MyMiddleware(RequestDelegate next, A instanceOfA)
{
  _a = instanceOfA;
}

public async Task Invoke(HttpContext context)
{
    Console.WriteLine(_a.Name); // should print "Some name"
    await this._next(context);
}

Csharp相关问答推荐

Blazor:类型或命名空间名称Components在命名空间中不存在''

EF Core判断是否应用了AsSplitQuery()

为什么这个Reflection. Emit代码会导致一个DDL ViolationException?

始终保留数组中的最后N个值,丢弃最老的

"virtual"修饰符对接口成员有什么影响?

我需要两个属性类吗

MongoDB.NET-将数据绑定到模型类,但无法读取整数值

用C#调用由缓冲区指针参数组成的C API

System.Net.Http.HttpClient.SendAsync(request)在docker容器内的POST方法30秒后停止

JSON空引用异常仅在调试器中忽略try-Catch块,但在其他上下文中捕获得很好

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

ASP.NET Core MVC将值从视图传递到控制器时出现问题

C#自定义验证属性未触发IsValid方法

C#多键字典和TryGetValue

如何在.NET Maui中将事件与MVVM一起使用?

源代码生成器项目使用`dotnet build`编译,而不是在Visual Studio中编译?

SharpZipLib在文件名前加上目录名,生成tar.gz

在使用xUnit和Mock执行单元测试时,控制器ViewResult返回空的Model集合

.NET8支持Vector512,但为什么向量不能达到512位?

测试单个对象是否与Func<;T,bool>;匹配