Как использовать тот же экземпляр синглтона на страницах Razor? - PullRequest
0 голосов
/ 27 января 2020

Я пишу ASP. NET Базовое приложение и столкнулся с особой проблемой, заключающейся в том, что на моих страницах Razor, похоже, используются отдельные экземпляры, отличные от остальной части приложения.

Проблема проявляется не показывая элементов в свойстве List службы, которая пуста на страницах Razor, даже если элементы были добавлены обработчиками страниц.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<MyContext>();
    services.AddSingleton<MyService>(new MyService());

    services.AddRazorPages();
}
public class MyService
{
    public int[] Items { get { return this.items.ToArray(); } }

    private List<int> items = new List<int>();

    public MyService() {}

    public void Add(int i) => this.items.Add(i);
}
public async Task<IActionResult> OnPostAddAsync(MyService myService)
{
    myService.Add(1);
}
@page
@inject MyService myService
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<a asp-page-handler="Add">Add</a>
<p>
    @myService.Items.Count() - always 0
</p>

Отладка также показывает Приватный список не должен иметь элементов на страницах Razor, даже если он есть где-то еще.


Насколько я понимаю, у синглтонов должен быть только один экземпляр, а не несколько.

Я попытался реализовать шаблон синглтона с закрытый конструктор, stati c instance-getter и служба, добавленная как AddSingleton<MyService>(f => MyService.GetInstance()), но возникла исключительная ситуация, когда внедрение зависимостей не может создать экземпляр.

Привязка к модели сложные типы не должны быть абстрактными или значениями и должны иметь конструктор без параметров.


Что я делаю не так? Как заставить страницы Razor использовать один и тот же экземпляр синглтона?

1 Ответ

0 голосов
/ 27 января 2020

Решение состоит в том, чтобы внедрить службу в конструкторе IndexModel, а не в качестве параметра метода обработчика страницы.

private readonly MyService _myService;

public IndexModel(MyService myService)
{
    _myService = myService;
}

public async Task<IActionResult> OnPostAddAsync()
{
    _myService.Add(1);
}
...