#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
отправляет сообщение очереди.