从 SingleInstance 组件获取 PerRequest 服务
Getting a PerRequest service from SingleInstance component
我正在尝试完成这项工作:
builder.RegisterInstance(EngineFactory.Instance).SingleInstance().ExternallyOwned();
builder.Register(c =>
{
EngineFactory engineFactory = DependencyResolver.Current.GetService<EngineFactory>();
//EngineFactory engineFactory = c.Resolve<EngineFactory>();
IEngineService engineService = engineFactory.GetService();
return engineService;
}).InstancePerRequest().As<IEngineService>();
我收到错误消息:
No scope with a Tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested.
This generally indicates that a component registered as per-HTTP request is being requested by a SingleInstance() component (or a similar scenario.)
Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself.
为了清楚起见,我希望 EngineFactory 是一个单例(即外部创建的)并且 IEngineService 是一个 Per(web)Request 实例。
控制器 属性 注入 IEngineService 时发生错误。
我不明白我做错了什么...
AFAICT,您报告的代码是正确的。
特别是:
// this is ok.
builder.RegisterInstance(EngineFactory.Instance).SingleInstance().ExternallyOwned();
// you can use c.Resolve<EngineFactory>() and probably you should,
// but really, is the same as your code
builder.Register(c => c.Resolve<EngineFactory>().GetService())
.InstancePerRequest().AsImplementedInterfaces();
您收到的错误消息是您将 IEngineService 解析绑定到 Http 请求。在 Autofac 中,这是通过标记范围管理的,即通过负责对象跟踪和处置的容器。标记范围只是一个带有名称的范围。
当使用 InstancePerRequest 时,Autofac 会搜索一个名为 AutofacWebRequest 的范围,它是由 Autofac/Asp.Net 集成自动为您创建和处理的,可能未正确设置。
您的问题几乎可以肯定是在 Autofac/Asp.Net 集成配置中。
所以,参考guide on the website,有问题再问
最后一件事:如果您还没有阅读 Autofac Lifetime Primer。如果你使用 Autofac,它就是纯金。
编辑:你碰巧在 Asp.Net 核心?如果是这种情况,here 您可以找到一条说明不要使用 InstancePerRequest。
我正在尝试完成这项工作:
builder.RegisterInstance(EngineFactory.Instance).SingleInstance().ExternallyOwned();
builder.Register(c =>
{
EngineFactory engineFactory = DependencyResolver.Current.GetService<EngineFactory>();
//EngineFactory engineFactory = c.Resolve<EngineFactory>();
IEngineService engineService = engineFactory.GetService();
return engineService;
}).InstancePerRequest().As<IEngineService>();
我收到错误消息:
No scope with a Tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested.
This generally indicates that a component registered as per-HTTP request is being requested by a SingleInstance() component (or a similar scenario.)
Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself.
为了清楚起见,我希望 EngineFactory 是一个单例(即外部创建的)并且 IEngineService 是一个 Per(web)Request 实例。
控制器 属性 注入 IEngineService 时发生错误。
我不明白我做错了什么...
AFAICT,您报告的代码是正确的。
特别是:
// this is ok.
builder.RegisterInstance(EngineFactory.Instance).SingleInstance().ExternallyOwned();
// you can use c.Resolve<EngineFactory>() and probably you should,
// but really, is the same as your code
builder.Register(c => c.Resolve<EngineFactory>().GetService())
.InstancePerRequest().AsImplementedInterfaces();
您收到的错误消息是您将 IEngineService 解析绑定到 Http 请求。在 Autofac 中,这是通过标记范围管理的,即通过负责对象跟踪和处置的容器。标记范围只是一个带有名称的范围。
当使用 InstancePerRequest 时,Autofac 会搜索一个名为 AutofacWebRequest 的范围,它是由 Autofac/Asp.Net 集成自动为您创建和处理的,可能未正确设置。
您的问题几乎可以肯定是在 Autofac/Asp.Net 集成配置中。
所以,参考guide on the website,有问题再问
最后一件事:如果您还没有阅读 Autofac Lifetime Primer。如果你使用 Autofac,它就是纯金。
编辑:你碰巧在 Asp.Net 核心?如果是这种情况,here 您可以找到一条说明不要使用 InstancePerRequest。