Внедрение зависимостей в переходный, а затем переходный в одноэлементный

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

#c# #asp.net #.net #.net-ядро #внедрение зависимостей

Вопрос:

У меня scoped Context есть доступ к нему из transient службы через метод. Эта transient служба внедряется в singleton службу.

Станет ли мой scoped 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);

    }
}
  

Вся идея состоит в том, чтобы иметь возможность передавать идентификатор контекста, который является уникальным для конкретного «запроса». Запрос поступает не от dotnet контроллера, он поступает из класса получателя очереди.

Или, перефразируя это, насколько глубоко это преобразование в одноэлементный выполняется для дерева инъекций зависимостей.

Ответ №1:

Не разрешайте службу с ограниченной областью из одноэлементного. Это может привести к неправильному состоянию службы при обработке последующих запросов. Это нормально для:

  • Разрешите одноэлементную службу из ограниченной или временной службы.
  • Разрешите службу с ограниченной областью из другой службы с ограниченной областью или временной службы.

пожалуйста, ознакомьтесь с этой ссылкой Срок службы

Ответ №2:

Станет ли мой контекст с ограниченной областью действия одноэлементным или он останется ограниченным?

Он останется ограниченным.

В ваш одноэлементный экземпляр будет RequestContextRegistrator введен, который, в свою очередь, будет иметь Context введенный; этот Context экземпляр будет существовать до тех пор, пока ваше приложение не завершится, поскольку одноэлемент сохранит свою ссылку, однако любой другой класс, для которого требуется an IContext , будет иметь новый Context введенный.

Комментарии:

1. Не приведет ли это в конечном итоге к утечке памяти?

2. Одноэлементный элемент и его зависимости будут собираться мусором только при выгрузке AppDomain содержимого; поскольку вы создаете одноэлементный элемент, вы явно запрашиваете это поведение. Задействовано всего 3 экземпляра, поэтому это не должно вызывать проблем с памятью.

3. С каждым сообщением очереди будет новое context , если служба потребляет 1.000.000 сообщений, разве это не проблема?

4. Что такое сообщение очереди? Вы не использовали какой-либо другой класс, который имеет IContext зависимость.

5. QueueSender отправляет сообщение очереди.