Как установить свойство только для чтения в асинхронном конструкторе C # - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть служба в 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();
    }
}

Это дает мне такую ​​ошибку:

"Поле, доступное только для чтения, не может быть назначено (кромев конструкторе или инициализаторе переменной) "

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 30 сентября 2019

Как пользователи упоминали в комментариях выше, я ошибался, полагая, что могу сделать конструктор асинхронным.

Мэтью Уотсон и Стивен Клири предоставили мне ссылку с хорошей альтернативой моей проблеме: 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 голосов
/ 30 сентября 2019

Одним из распространенных примеров решения вашей проблемы является создание статического метода в классе и вызов оттуда метода 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...