Metody usługi SignalR Hub próbują rozpoznać parametry z di
Metody usługi SignalR Hub obsługują teraz wstrzykiwanie usług z kontenera wstrzykiwania zależności (DI). W rzadkich przypadkach może to uszkodzić aplikacje, które mają typ di, który jest również akceptowany w metodach koncentratora z komunikatów klienta usługi SignalR.
Wprowadzona wersja
ASP.NET Core 7.0
Poprzednie zachowanie
Jeśli zaakceptowano typ w metodzie Centrum, który był również w kontenerze wstrzykiwania zależności, typ będzie zawsze rozpoznawany z komunikatu wysyłanego przez klienta.
Services.AddScoped<SomeCustomType>();
class MyHub : Hub
{
// type always comes from the client, never comes from DI
public Task Method(string text, SomeCustomType type) => Task.CompletedTask;
}
Nowe zachowanie
Typy w di są sprawdzane podczas uruchamiania aplikacji przy użyciu, IServiceProviderIsService aby określić, czy argument w metodzie hub pochodzi z di lub z klienta.
W poniższym przykładzie założono, że używasz domyślnego kontenera di, SomeCustomType
pochodzi z kontenera DI zamiast z klienta. Jeśli klient spróbuje wysłać SomeCustomType
polecenie , zostanie wyświetlony błąd:
Services.AddScoped<SomeCustomType>();
class MyHub : Hub
{
// comes from DI by default
public Task Method(string text, SomeCustomType type) => Task.CompletedTask;
}
Typ zmiany powodującej niezgodność
Ta zmiana ma wpływ na zgodność ze źródłem.
Przyczyna wprowadzenia zmiany
Ta zmiana poprawia środowisko użytkownika podczas korzystania z różnych usług w różnych metodach Centrum. Zwiększa również wydajność, nie wymagając od użytkownika wstrzykiwania wszystkich zależności w konstruktorze centrum.
Prawdopodobieństwo wystąpienia przerwania aplikacji jest niskie, ponieważ nie jest powszechne posiadanie typu di i jako argument w metodzie Centrum w tym samym czasie.
Zalecana akcja
Jeśli ta zmiana zostanie przerwana, możesz wyłączyć tę funkcję, ustawiając wartość DisableImplicitFromServicesParameters
true:
Services.AddSignalR(options =>
{
options.DisableImplicitFromServicesParameters = true;
});
Jeśli zmiana zostanie przerwana, ale chcesz użyć tej funkcji bez klientów powodujących niezgodność, możesz wyłączyć tę funkcję, jak pokazano powyżej, i użyć atrybutu implementujący IFromServiceMetadata nowe argumenty/metody centrum:
Services.AddScoped<SomeCustomType>();
Services.AddScoped<SomeCustomType2>();
class MyHub : Hub
{
// old method with new feature (non-breaking), only SomeCustomType2 is resolved from DI
public Task MethodA(string arguments, SomeCustomType type, [FromServices] SomeCustomType2 type2);
// new method
public Task MethodB(string arguments, [FromServices] SomeCustomType type);
}
Dotyczy interfejsów API
Metody koncentratora