2016-02-12 15 views
5

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ę!

+0

"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

+0

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? –

+1

W takim przypadku wydaje się, że twoje oprogramowanie pośrednie jest gdzieś w potoku przed utworzeniem "zakresu". – danludwig

Odpowiedz

3

Czy próbowałeś już korzystać z context.RequestServices?

Powiązane problemy