[英]How to use the same singleton instance from main appdomain in childs appdomain
[英]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.