当我像这样为IPersonProvider注册工厂时:
为什么会出现这个错误?如何解决问题?我认为将工厂注册为单例,可以像整个应用程序一样长时间存活,不应该有任何问题创建范围对象 - 最终那些创建的对象并不是单例的依赖项。
services.AddScoped<IPersonProvider, PersonProvider>();
services.AddSingleton<Func<IPersonProvider>>(sp => () => sp.GetService<IPersonProvider>());
我遇到了错误:
InvalidOperationException: 无法从根提供程序解析范围服务 'DependencyApp.Provider.IPersonProvider'。
我知道不能使用Scoped依赖项来解析Singleton对象,但据我所知,我的工厂没有任何Scoped依赖项 - 实际上它没有任何依赖项。当我像这样请求时,它只是创建对象:
public class HomeController : Controller
{
private readonly Func<IPersonProvider> _factory;
public HomeController(Func<IPersonProvider> factory)
{
_factory = factory;
}
[Route("/")]
public string Calculate()
{
var personProvider = _factory();
//.
//.
//.
return "test";
}
}
为什么会出现这个错误?如何解决问题?我认为将工厂注册为单例,可以像整个应用程序一样长时间存活,不应该有任何问题创建范围对象 - 最终那些创建的对象并不是单例的依赖项。
Func
设置为瞬态服务,问题是否仍然存在?问题可能在于,由于它是单例模式,因此sp
实例始终是根实例,但如果将服务定义为瞬态,则情况可能并非如此。 - Matthew