簡體   English   中英

如何在 Razor 頁面中使用相同的單例實例?

[英]How to use the same singleton instance in Razor pages?

我正在編寫一個 ASP.NET Core 應用程序,但遇到了一個奇怪的問題,即我的 Razor 頁面似乎使用與應用程序其余部分不同的單例實例。

該問題通過在 Razor 頁面中顯示服務的List屬性中的任何項目都為空來表現出來,即使頁面處理程序添加了項目也是如此。

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 頁面中沒有項目,即使它在其他地方也沒有。


根據我的理解,單身人士應該只有一個實例,而不是多個。

我嘗試使用私有構造函數、靜態實例獲取器實現單例模式,並將服務添加為AddSingleton<MyService>(f => MyService.GetInstance()) ,但是遇到了關於依賴注入無法執行的異常創建一個實例。

模型綁定復雜類型不能是抽象類型或值類型,並且必須具有無參數構造函數。


我究竟做錯了什么? 如何讓 Razor 頁面使用相同的單例實例?

解決方案是在IndexModel構造函數中注入服務,而不是作為頁面處理程序方法的參數。

private readonly MyService _myService;

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM