Chciałbym zmienić usługę o zasięgu żądania lub ustawić ją w niestandardowej warstwie oprogramowania pośredniego.Usługa Asp.Net Core Middleware zależna od bieżącego użytkownika Użytkownik
szczególności chcę, aby móc zrobić coś jak poniżej contrived przykład w Startup.cs
:
public void ConfigureServices(IServiceCollection service)
{
service.AddScoped<IMyUserDependentService>((provider) => {
return new MyService());
});
}
public void Configure(...) {
//other config removed
app.Use(async (context, next) => {
var myService = context.ApplicationServices.GetService<IMyUserDependentService>();
myService.SetUser(context.User.Identity.Name);//Name is Fred
next.Invoke();
});
}
Następnie w sterowniku to zrobić:
public class HomeController: Controller
{
public HomeController(IMyUserDependentService myService)
{
//myService.UserName should equal Fred
}
}
Problem polega na tym, że tego nie robi nie działa. myService.UserName nie jest Fredem w kontrolerze, ma wartość null. Myślę, że kontener IOC tworzy nowe wystąpienie w kontrolerze, a nie używa go w oprogramowaniu pośredniczącym.
Jeśli zmienię zakres usługi na Transient, Fred zostanie zapamiętany, ale to nie pomoże, ponieważ usługa jest zależna od tego, kto jest bieżącym użytkownikiem.
Podsumowując, potrzebuję utworzyć/lub edytować usługę, która wymaga bieżącego użytkownika (lub innych zmiennych bieżących żądań), ale nie mogę tego przetworzyć.
Z góry dziękuję!
"Myślę, że kontener IOC tworzy nowe wystąpienie w kontrolerze, a nie używa zestawu w oprogramowaniu pośredniczącym." Możesz to sprawdzić, umieszczając punkt przerwania w konstruktorze 'IMyUserDependentService' i sprawdzając, czy jest on tworzony więcej niż jeden raz podczas żądania. – danludwig
Co ciekawe, dla kontrolera za każdym razem tworzona jest nowa usługa, ale w ramach metody middleware ".use" usługa jest taka sama jak poprzednie żądanie ..... wtf? –
W takim przypadku wydaje się, że twoje oprogramowanie pośrednie jest gdzieś w potoku przed utworzeniem "zakresu". – danludwig