【问题标题】:How to set a readonly property in a C# async constructor如何在 C# 异步构造函数中设置只读属性
【发布时间】:2019-09-30 21:51:02
【问题描述】:

我在 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();
    }
}

它给了我这个错误:

“不能将只读字段分配给(在构造函数或变量初始化程序中除外)”

有什么想法吗?

【问题讨论】:

  • 你展示的不是构造函数,而是方法。据我记得没有异步构造函数。
  • 你所拥有的是一个与其封闭类型同名的异步方法
  • 你不能创建异步构造函数。构造函数不返回值。你刚刚创建了一个方法。
  • 您可能会发现this article from Stephen Cleary 很有启发性。
  • @FabricioRodriguez:不,你不能有异步构造函数。 There are a few other options, though.

标签: c# .net-core .net-core-2.2


【解决方案1】:

正如用户在上面的 cmets 中提到的,我错误地认为我可以使构造函数异步。

Mathew Watson 和 Stephen Cleary 为我提供了一个链接,可以很好地解决我的问题:https://blog.stephencleary.com/2013/01/async-oop-2-constructors.html

总结:

工厂模式 使用静态创建方法,使类型成为自己的工厂:

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();
  ...
}

【讨论】:

    【解决方案2】:

    解决您的问题的一个常见示例是在类上创建一个静态方法并从那里调用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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多