#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()
после того, как я удалил эту строку, все работает, как и ожидалось.