Autofac登録で非同期メソッドを呼び出す方法は?

通常、この操作の順序を完全に制御し、例外をキャッチし、繰り返し、それらのいくつかの間の時間を制御することが重要であるため、解決段階で I/O 集中型の作業を行うことは間違った設計だと思います。

解決策は、工場でそれらを延期することです。 SomeClass を置き換えさせてください より意味のある NpgsqlConnection :

var builder = new ContainerBuilder();
builder.Register(context =>
{
    // make sure not to capture temporary context:
    // https://autofaccn.readthedocs.io/en/latest/advanced/concurrency.html#service-resolution
    var connectionString = context.Resolve<IConfiguration>().GetConnectionString("MyDb");

    return new Func<Task<NpgsqlConnection>>(async () =>
    {
        var connection = new NpgsqlConnection(connectionString);
        await connection.OpenAsync();
        return connection;
    });
});

接続ユーザーは次のようになります:

public sealed class Repository
{
    private readonly Func<Task<NpgsqlConnection>> _connectionFactory;

    public Repository(Func<Task<NpgsqlConnection>> connectionFactory)
    {
        _connectionFactory = connectionFactory;
    }

    public async Task<string> GetServerVersionAsync()
    {
        using (var openedConnection = await _connectionFactory())
            return openedConnection.ServerVersion;
    }
}

Autofac が非同期登録をサポートする場合でも、Repository でファクトリを要求することは有益です。 接続は限られたリソースであり、開かれる時間を制限する方がよいためです。


これは古い質問ですが、autofac はそれをサポートしていないと思います。

使用したもの:

builder.Register(c =>
  {
      var bar= c.Resolve<IBar>();
      var foo = new Foo(bar);
      return foo.ComputeAsync().ConfigureAwait(false).GetAwaiter().GetResult();
  })
.As<IFoo>()
.SingleInstance();

しかし、コメントで述べたように:Registering async factory in Autofac