繁体   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