Я пишу 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 использовать один и тот же экземпляр синглтона?