Поставщик услуг.GetService возвращает тот же экземпляр для службы с областью действия на фабрике временных экземпляров

#c# #asp.net-core

Вопрос:

В asp.net основной проект 3.1, у меня есть следующий контроллер (ctor):

 public MyController(IMyService myService) { }
 

IMyService Интерфейс и MyService

 public interface IMyService { }

public class MyService : IMyService { }
 

Где IService зарегистрирован в моем Startup.cs следующим образом:

 services.AddScoped<MyService>();
services.AddTransient(sp =>
                      {
                          var service = sp.GetRequiredService<MyService>();
                          // do something on the service...
                          return service as IMyService;
                      });
 

Однако, когда я выполняю несколько запросов, я вижу, что только первый запрос инициирует новый экземпляр MyService (т. Е., Когда я помещаю точку останова в MyService конструктор, она будет прерываться только при первом запросе).

Больше всего меня беспокоит то, что если я изменяю services.AddTransient(sp => ... строку в Startup.cs файле на services.AddScoped(sp => ... — все работает, и экземпляр инициируется при каждом запросе.

Как я могу устранить проблему, чтобы, когда я получаю услуги внутри фабрики экземпляров, они собирались в соответствии с правильной областью запроса?

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

1. Не смог воспроизвести — в моем простом повторении точка останова каждый раз поражается. Можете ли вы опубликовать репро? Кроме того, я бы настоятельно рекомендовал не разрешать службы с областью действия для временных служб — это может привести к сбою, если временная служба будет разрешена из корневой области.

2. Я попробовал еще раз выполнить чистый проект, и, похоже, вы правы, он не будет воспроизводиться. Затем я узнаю, что в моем проекте было использование UnityContainer, и это все испортило.

Ответ №1:

После комментария @GuruStron я обнаружил, что у меня есть следующая строка в моем Program.cs , хотя на самом деле я не использую контейнер Unity в своем проекте:

 .UseUnityServiceProvider()
 

после того, как я удалил эту строку, все работает, как и ожидалось.