簡體   English   中英

如何在 C# 異步構造函數中設置只讀屬性

[英]How to set a readonly property in a C# async constructor

我在 ASP.Net Core 2.2 Web API 中有一項服務。 構造函數是異步的,因為它調用異步方法。 但是因為構造函數是異步的,所以它會抱怨試圖初始化一個屬性。

public class MyService
{
    private readonly IServiceScopeFactory _serviceScopeFactory;

    public async Task MyService(IServiceScopeFactory serviceScopeFactory)
    {
        this._serviceScopeFactory = serviceScopeFactory;
        await DoSomething();
    }
}

它給了我這個錯誤:

“不能將只讀字段分配給(構造函數或變量初始化程序除外)”

有任何想法嗎?

正如用戶在上面的評論中提到的,我錯誤地認為我可以使構造函數異步。

Mathew Watson 和 Stephen Cleary 為我提供了一個很好的解決問題的鏈接: https://blog.stephencleary.com/2013/01/async-oop-2-constructors.html

概括:

工廠模式使用 static 創建方法,使類型成為自己的工廠:

public sealed class MyClass
{
  private MyData asyncData;
  private MyClass() { ... }

  private async Task<MyClass> InitializeAsync()
  {
    asyncData = await GetDataAsync();
    return this;
  }

  public static Task<MyClass> CreateAsync()
  {
    var ret = new MyClass();
    return ret.InitializeAsync();
  }
}

public static async Task UseMyClassAsync()
{
  MyClass instance = await MyClass.CreateAsync();
  ...
}

解決您的問題的一個常見示例是在 class 上創建一個 static 方法,並從那里調用async方法以及構造函數。

public class MyService
{
    private readonly IServiceScopeFactory _serviceScopeFactory;

    public static async Task<MyService> BuildMyService(IServiceScopeFactory serviceScopeFactory)
    {
        await DoSomething();
        return new MyService(serviceScopeFactory);
    }

    public MyService(IServiceScopeFactory serviceScopeFactory)
    {
        this._serviceScopeFactory = serviceScopeFactory;
    }
}

暫無
暫無

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

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