Внедрение зависимостей вне конструктора в блейзоре на стороне сервера

#c# #asp.net-core #dependency-injection #blazor

#c# #asp.net-ядро #внедрение зависимостей #blazor

Вопрос:

Я хочу использовать службу с ограниченной областью действия в методе одноэлементной службы в Блейзоре на стороне сервера. Я узнал, что вы можете использовать [FromServices] атрибут в параметрах функции, но когда я вызываю метод, я получаю ошибку компилятора за вызов метода с меньшим количеством параметров. Я попытался вызвать метод с фиктивным параметром в надежде, что он будет перезаписан при вызове, но это было не так.

Служба с ограниченной областью действия:

 public class UserContext
{
    public string SomeUserRelatedData {get; set;}
}
  

Одноэлементный сервис:

 public class GlobalService
{
    ...
    public void DoSomethingWithUserData([FromServices]UserContext usercontext)
    {
        ...
    }
}
  

Startup.cs

 public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddSingleton<GlobalService>();
        services.AddScoped<UserContext>();
    }
}
  

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

1. Не уверен, работает ли это только в контроллерах? «Указывает, что параметр действия должен быть привязан с использованием служб запросов «. FromServicesAttribute

Ответ №1:

К сожалению, вы не можете этого сделать.

Вы можете использовать это [FromServices] только в методе, который вызывается фреймворком. В этом случае в любом действии от контроллера или в Invoke методе в промежуточном программном обеспечении.

Но есть решение вашей проблемы. Я предполагаю, что вызываемый метод DoSomethingWithUserData является областью видимости. В этот класс (или метод, если это конечная точка) вы можете ввести свой UserContext и вызвать метод из GlobalService этого экземпляра.