Внедрение зависимостей в файле компонента Blazor - PullRequest
0 голосов
/ 22 сентября 2019

В моем приложении есть блэйз-компонент:

public class IndexComponent : ComponentBase
{
    public string ContentRoot { get; set; }
    public string WebRoot { get; set; }
    private IHostingEnvironment HostingEnvironment;

    public IndexComponent(IHostingEnvironment hostingEnvironment)
    {
        HostingEnvironment = hostingEnvironment;
    }

    protected override async Task OnInitAsync()
    {
        //Some Code Here
    }
}

Я пытаюсь использовать DI в своем приложении, например IHostingEnvironment.

Код не дает здесь ошибки времени компиляции, но когдая запускаю его, чем в коде файла этой бритвы (файл Index.razor.g.cs):

public class Index : IndexComponent

в этой строке написано:

Нет аргументовучитывая, что это соответствует необходимому формальному параметру hostingEnvironment IndexComponent.IndexComponent

Это можно решить с помощью @inject IHostingEnvironment в файле Razor, но я перемещаю свой функциональный блок из Razor в файл IndexComponent.cs, так что нужноэто там.

Ни один из этих способов не работает следующим образом:

[Inject]
IHostingEnvironment HostingEnvironment

Что здесь будет работать?

Примечание. Не использовать ViewModel

Обновление 1

В StartUp.cs путем добавления пространства имен

using Microsoft.AspNetCore.Hosting.Internal;

И чем

services.AddSingleton<IHostingEnvironment>(new HostingEnvironment());

Теперь он может зарегистрировать IHostingEnvironment на стороне клиентапроект, но он не имеет значения для его свойстваies (contentrootpath и webrootpath).

Здесь доступна только одна вещь - EnvironmentName и ее значение всегда равно Production,

Ответы [ 2 ]

3 голосов
/ 22 сентября 2019

Обновление:

Ошибка от WebAssembly, поэтому это приложение на стороне клиента.На клиенте нет HostingEnvironment, и поэтому сервис не зарегистрирован.Было бы бесполезно, если бы это было.

Итак, отступите назад: зачем (как вы думаете) оно вам нужно?


Вы должны сделать его защищенным или общедоступным свойством чтения / записи:

// in IndexComponent
[Inject]
protected IHostingEnvironment HostingEnvironment { get; set; }

и удалите параметры конструктора.

Примечание: IHostingEnvironment помечено как устаревшее.

1 голос
/ 22 сентября 2019

Из этого комментария:

WASM: System.InvalidOperationException: Невозможно предоставить значение для свойства 'HostingEnvironment' для типа 'JewelShut.Client.Pages.Index'.Не существует зарегистрированного сервиса типа «Microsoft.AspNetCore.Hosting.IHostingEnvironment»

Я предполагаю, что это клиентское приложение Blazor.(Мои извинения, если я ошибаюсь с моим предположением.)На стороне клиента Blazor IHostingEnvironment не зарегистрирован по умолчанию в контейнере DI.Тем не менее ошибка говорит о том, что служба, которую вы пытаетесь внедрить, не зарегистрирована.Для регистрации услуги:

В файле Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    //few sample for you
    services.AddScoped<AuthenticationStateProvider, ApiAuthenticationStateProvider>();
    services.AddAuthorizationCore();

    //register the required services
    //services.Add...
}

If the injected service is registered the way @Henk Holterman has suggested is the right answer. 

[Di in blazor][1]



  [1]: https://docs.microsoft.com/en-us/aspnet/core/blazor/dependency-injection?view=aspnetcore-3.0
...