gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:41:10 25 4
gpt4 key购买 nike

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

我也在考虑另一种方式:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com