Внедрение зависимостей на странице Blazor по сравнению с конструктором контроллера - PullRequest
0 голосов
/ 12 марта 2020

Я работаю над новым приложением и выбрал go с Blazor Server Side. У меня есть существующая настройка бэкэнда, и я пытаюсь заменить только проект пользовательского интерфейса. У меня есть реестр для всех служб, и этот реестр используется как в API, так и в проекте пользовательского интерфейса Blazor:

public class DependencyContainer
{

    public static void RegisterServices(IServiceCollection services)
    {
        #region Domain InMemoryBus MediatR

        services.AddScoped<IMediatorHandler, InMemoryBus>();

        #endregion

        #region Domain Handlers

        services.AddScoped<IRequestHandler<RadarCreateCommand, bool>, RadarProjectCommandHandler>();

        #endregion

        #region Application Layer

        services.AddScoped<IRadarProjectService, RadarProjectService>();
        //services.AddScoped<IContactService, ContactService>();
        //services.AddScoped<ICategoryService, CategoryService>();
        //services.AddScoped<ISubCategoryService, SubCategoryService>();

        #endregion

        #region Infrastructure/Data Layer

        services.AddScoped<IPlaygroundBiRepository, PlaygroundBiRepository>();
        //services.AddScoped<IContactRepository, ContactRepository>();
        //services.AddScoped<ICategoryRepository, CategoryRepository>();
        //services.AddScoped<ISubCategoryRepository, SubCategoryRepository>();

        services.AddScoped<DesignTrackerContext>();
        services.AddScoped<PlaygroundBiContext>();

        #endregion

    }

}

В моем проекте Blazor есть ссылка на проект реестра, и я вызываю этот метод в ' Startup.cs 'as:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        ...
        services.AddMediatR(typeof(Startup));
        services.RegisterAutoMapper();

        RegisterServices(services);
    }

Теперь на моей странице я хочу показать список проектов. Существует сервис, который будет выставлять все проекты POCO, не являющиеся объектами. Страница настроена так:

@page "/projects"
@using DesignTracker.Application.Interfaces
@using DesignTracker.Application.ViewModels

<div class="container-fluid">
    <div class="row my-4">
        <div class="col-12">
            <TelerikGrid Data="@allProjects" Height="550px" FilterMode="@GridFilterMode.FilterMenu"
                         Sortable="true" Pageable="true" PageSize="20" Groupable="true"
                         EditMode="@GridEditMode.Inline">
                <GridColumns>
                    <GridColumn Field="Id" Title="Id" Width="100px" Editable="false" Groupable="false" />
                    <GridColumn Field="Date">
                        <Template>
                            @((context as RadarProjectViewModel).LastUpdateTime?.ToString("dddd, dd MMM yyyy"))
                        </Template>
                    </GridColumn>
                    <GridColumn Field="Name" />
                    <GridColumn Field="Department" />
                    <GridColumn Field="Summary" />
                    <GridCommandColumn>
                        <GridCommandButton Command="Save" Icon="@IconName.Save" ShowInEdit="true">Update</GridCommandButton>
                        <GridCommandButton Command="Edit" Icon="@IconName.Edit" Primary="true">Edit</GridCommandButton>
                        <GridCommandButton Command="Delete" Icon="@IconName.Delete">Delete</GridCommandButton>
                        <GridCommandButton Command="Cancel" Icon="@IconName.Cancel" ShowInEdit="true">Cancel</GridCommandButton>
                    </GridCommandColumn>
                </GridColumns>
                <GridToolBar>
                    <GridCommandButton Command="Add" Icon="@IconName.Plus" Primary="true">Add Project</GridCommandButton>
                </GridToolBar>
            </TelerikGrid>
        </div>
    </div>
</div>

@code {
    private readonly IRadarProjectService _service;
    private IEnumerable<RadarProjectViewModel> allProjects;
}

Если я последую примеру WeatherService, который поставляется с шаблонами Blazor, я не вижу Io C в действии, потому что есть метод, который вызывается в OnInitializedAsync(), который фактически инициализирует прогнозы:

List<WeatherForecast> forecasts { get; set; }

protected override async Task OnInitializedAsync()
{
    await GetForecasts();
}

async Task GetForecasts()
{
    forecasts = await ForecastService.GetForecastListAsync(DateTime.Now);
}

Исходя из моего MVC и Asp. Net Основного опыта, все, что мне нужно было сделать, это создать вспомогательные интерфейсы для необходимых мне услуг и создать загруженный конструктор и механизм DI вводят инициализированные объекты во время выполнения.

Как это возможно в Blazor's code{ ... }?

1 Ответ

2 голосов
/ 12 марта 2020

Чтобы применить инъекцию зависимостей непосредственно на страницу блейзора, используйте директиву @inject.

Пример

.razor page:

@page "/"
@using YourServiceNamespace

@inject IYourService yourService // Here injecting dependency

<div>/*some html here*/</div>

@code 
{
    public string[] ArrayOfStrings => yourService.GetArrayOfStrings(); 
}

Startup.cs file:

services.AddScoped<IYourService, YourService>();

Blazor автоматически получит ваш сервис из среды приложения и внедрит его непосредственно на страницу, чтобы вы могли использовать его, как из простого кода csharp.

...