通常、この操作の順序を完全に制御し、例外をキャッチし、繰り返し、それらのいくつかの間の時間を制御することが重要であるため、解決段階で 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