c# - ASP.NET 核心。配置DI为不同的接口(interface)获取相同的对象

标签 c# asp.net-core asp.net-core-mvc asp.net-core-webapi

我有中间件,它可以完成一些工作并创建对象。我需要将此对象注入(inject)到 Controller 中。 到目前为止,我看到了具有额外层的解决方案,通过向 DI 添加一些工厂,该工厂通过从 context.Items['myobject_created_and_placed_here_in_middleware'] 中提取已创建的对象来创建此类对象。

我也在考虑另一种方式:

public interface IReader
{
    string Get();
}

public interface IWriter
{
    string Set(string value);
}

public class Object1 : IReader, IWriter
{
    public string s1 { get; set; }
    public string Get()
    {
        return this.s1;
    }

    public string Set(string value)
    {
        this.s1 = value;
        return s1;
    }
}

public class Middleware1
{
    RequestDelegate next;
    private readonly IReader _reader;


    public Middleware1(RequestDelegate next, IReader reader)
    {
        this.next = next;
        _reader = reader;
    }

    public async Task Invoke(HttpContext context)
    {
        var test1 = _reader.Get();
        await next.Invoke(context);
    }
}

public class Middleware2
{
    RequestDelegate next;
    private readonly IWriter _writer;


    public Middleware2(RequestDelegate next, IWriter writer)
    {
        this.next = next;
        _writer = writer;
    }

    public async Task Invoke(HttpContext context)
    {
        _writer.Set("13168AAE-C886-453E-B655-ECE5D14645D9");
        await next.Invoke(context);
    }
}

启动.cs:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole();

        app.UseMiddleware<Middleware2>();
        app.UseMiddleware<Middleware1>();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }

到目前为止还不起作用。
这将返回不同的对象:

services.AddScoped<IReader,Object1>();
services.AddScoped<IWriter, Object1>();

这无法解析接口(interface):

services.AddScoped<Object1>();

问题是:如何在 DI 中注册它并为每个请求的不同接口(interface)获取相同的对象。

最佳答案

仅供引用:可以在 DI 注册之间共享单个对象,甚至在 ScopedTransient 注册之间也是如此。如果可能的话尽量避免。

public interface IGodObject { } //empty marker interface
public interface IWriter { }
public interface IReader { }
public class GodObject : IGodObject, IReader, IWriter { }

services.AddScoped<IGodObject>(p =>
{
    return new GodObject();
});

services.AddScoped<IReader>(p =>
{
    return p.GetService<IGodObject>() as IReader;
});

services.AddScoped<IWriter>(p =>
{
    return p.GetService<IGodObject>() as IWriter;
});

关于c# - ASP.NET 核心。配置DI为不同的接口(interface)获取相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43681127/

相关文章:

asp.net-core - 在 Active Directory 环境中生成 JWT

c# - Windows 身份验证 .Net Core 2.0 在没有安全提示的情况下显示用户名

c# - 如何从组合框中获取选定的数据行

c# - 使用部分类而不是抽象类有什么好处?

c# - 下载文件时如何限制带宽并允许多次下载?

c# - ELI5 : How does converting an IEnumerable to a list or array avoid the performance penalty of multiple enumeration of IEnumerable?

javascript - ASP.NET Core 3.0 MVC 连接中的 SignalR 保持事件状态不起作用?

c# - 是否有比使用 IAsyncActionFilter 授权更好的方法来授权用户是否处于角色或用户 ID 在数据库中以获取特定记录

c# - ASP.NET 5 MVC 6 : How to configure startup to send a html file when not on any mvc route

c# - 对象引用未设置为对象 ViewData ["Title"] = "Index"的实例;