在Autofac中注册一个异步工厂我有一个从存储库中获取的钱包类。我试图让它在Autofac中正确注册,以便使用钱包的类可以注入适当的实例。问题是存储库使用异步方法(返回任务)。Autofac是否支持这种情况?这不起作用:cb.RegisterType().As().SingleInstance();cb.Register(asyncc=>awaitc.Resolve().CreateAsync(App.WalletPath));cb.RegisterType().AsSelf()。.SingleInstance();在应用程序的某个地方,我只有:classViewModel{publicViewModel(Walletwallet){//nothingfancyhere}}当调用container.Resolve()我得到一个异常,说钱包没有注册。除非我弄错了,否则Autofac对异步工厂没有任何特定的支持。您仍然可以让它工作,但您必须编写一些样板代码,因为构造函数注入将不起作用。您还必须更加直截了当,说您想要Task而不是T整个代码如下所示:cb.RegisterType().As().SingleInstance();cb.Register(c=>c.Resolve().CreateAsync(App.WalletPath));cb.Register(asyncc=>newViewModel(awaitc.Resolve>())).SingleInstance();varcontainer=cb.Build();varviewModel=awaitcontainer.Resolve>();Autofac可能有一些扩展点可以使这段代码更简单,但我对它的了解还不足以帮助你。一种选择是让注册执行将异步调用转换为结果所需的阻塞。即:cb.Register(c=>c.Resolve().CreateAsync(App.WalletPath).Result);//nb:blockingcall这意味着AutoFac在解析依赖时会强制阻塞,服务的客户端不需要知道服务工厂是异步的。当然,这是否是一个好主意在很大程度上取决于你在做什么。这可能会导致死锁。Autofac在处理不同生命周期范围解析的某些逻辑中使用锁。所以如果异步工厂操作会尝试在另一个线程解析一些东西,就会出现死锁。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: