c# - 依赖注入(inject)作用域为 Transient,然后 Transient 为 Singleton

标签 c# asp.net .net .net-core dependency-injection

我有一个范围 Context,可以通过方法从transient服务访问。 此 transient 服务正在被注入(inject)到singleton服务中。

我的作用域Context会变成单例还是会保持作用域?

public class Context : IContext
{
    public string CorrelationId { get; set; }

    public Context(string id)
    {
        CorrelationId = id;
    }
}

上下文访问器:

internal class RequestContextRegistrator : IRequestContextRegistrator
{
    private IContext context;

    public IContext RegisterContext(IContext context)
    {
        this.context = context;

        return context;
    }

    public IContext Get()
    {
        return context ?? new Context()
        {
            CorrelationId = context.CorrelationId
        };
    }
}

和单例对象:

public class QueueSender<TCommand> 
{
    private readonly IRequestContextRegistrator provider;

    public QueueSender(IRequestContextRegistrator provider)
    {
       this.provider = provider;
    }

    public async Task Send(TCommand command)
    {
        var context = provider.Get();

        var message = PrepareServiceBusMessage(command, userAgent, context?.CorrelationId);

    }
}

整个想法是能够传递特定“请求”所独有的上下文 ID。该请求不是来自 dotnet Controller ,而是来自队列接收器类。

或者解释一下,这种到单例的转换对于依赖注入(inject)树来说有多深。

最佳答案

不要从单例解析范围服务。它可能会导致服务在处理后续请求时出现不正确的状态。很好:

  • 从作用域服务或 transient 服务解析单例服务。
  • 从另一个范围服务或临时服务解析范围服务。

请查看此链接 Service lifetime

关于c# - 依赖注入(inject)作用域为 Transient,然后 Transient 为 Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64115733/

相关文章:

javascript - jQuery ajax请求错误: callback not called

asp.net - asp mvc 路由有两个可选参数

c# - IIS 上 ASP.NET 页面的 Restful URL

c# - 是否可以启动相同的线程?

c# - WCF Web 服务调用超时

c# - 为什么 IDictionary<TKey,TValue> 不/不能实现 ILookup<TKey,TValue>?

c# - 打印时如何确定字符串的宽度?

c# - Task.WhenAll() 和 foreach(var task in tasks) 有什么区别

c# - c# 锁可以序列化对外部资源的访问吗?

c# - 正则表达式查找和替换以换行标签