在Autofac中注册异步工厂

Pei*_*ein 5 c# autofac async-await c#-5.0

我有一个从存储库中获取的Wallet类.我正在尝试在Autofac中正确注册,因此使用钱包的类可以注入适当的实例.问题是存储库使用异步方法(返回Task).Autofac是否支持此类案例?

这不起作用:

cb.RegisterType<WalletRepository>()
    .As<IWalletRepository>()
    .SingleInstance();
cb.Register(async c => await c.Resolve<IWalletRepository>().CreateAsync(App.WalletPath));
cb.RegisterType<ViewModel>()
    .AsSelf().
    .SingleInstance();
Run Code Online (Sandbox Code Playgroud)

在应用程序的某个地方我只有:

class ViewModel
{
    public ViewModel(Wallet wallet)
    {
        //nothing fancy here
    }
}
Run Code Online (Sandbox Code Playgroud)

在致电时container.Resolve<ViewModel>()我得到一个例外,说钱包没有注册.

svi*_*ick 9

除非我弄错了Autofac对async工厂没有任何具体的支持.您仍然可以使它工作,但您必须编写一些样板代码,因为构造函数注入将不起作用.你也必须更加文字,并说你想要Task<T>而不是T.整个代码看起来像这样:

cb.RegisterType<WalletRepository>()
  .As<IWalletRepository>()
  .SingleInstance();
cb.Register(c => c.Resolve<IWalletRepository>().CreateAsync(App.WalletPath));
cb.Register(async c => new ViewModel(await c.Resolve<Task<Wallet>>()))
  .SingleInstance();
var container = cb.Build();
var viewModel = await container.Resolve<Task<ViewModel>>();
Run Code Online (Sandbox Code Playgroud)

Autofac可能有一些扩展点可以使这个代码更简单,但我不太了解它可以帮助你.