Come chiamare il metodo asincrono nella registrazione Autofac?

Come chiamare il metodo asincrono nella registrazione Autofac?

Penso che fare qualsiasi lavoro intensivo di I/O in fase di risoluzione sia una progettazione sbagliata, perché di solito è importante avere il pieno controllo sull'ordine di queste operazioni, catturare le eccezioni, ripeterle, controllare il tempo tra alcune di esse, ecc.

La soluzione è rimandarli con le fabbriche. Consentimi di sostituire SomeClass con un NpgsqlConnection più significativo :

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

Ed ecco come può apparire l'utente della connessione:

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;
    }
}

Anche se Autofac supportasse le registrazioni asincrone, sarebbe comunque utile richiedere una factory in Repository costruttore, perché la connessione è una risorsa limitata ed è meglio limitare il tempo in cui viene aperta.


Questa è una vecchia domanda, ma penso che autofac non lo supporti.

Abbiamo usato:

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

Ma come accennato nei commenti:registrazione della fabbrica asincrona in Autofac