我有一个应用程序,其中共享对象需要对每个请求对象的引用。
Shared: Engine | Per Req: IExtensions() | Request
如果我尝试将IExtensions
直接注入到Engine
的构造函数中,即使是Lazy(Of IExtension)
,我也会得到一个“没有范围匹配[请求]从可见范围中可见该实例被要求。“尝试实例化每个IExtension
时的异常。
如何创建HttpRequestScoped实例,然后将其注入共享实例?
在Request
的工厂设置它(因此将Engine
注入RequestFactory
)会被认为是一种好习惯吗?
答案 0 :(得分:1)
由于Engine
的共享生命周期要求,您无法将请求范围的扩展注入其中。您可能拥有的是Engine上的方法或属性,它将主动解析当前请求范围中的扩展集合。
首先,让Engine
采用构造函数依赖:
public class Engine
{
public Engine(..., Func<IExtensions> extensionsPerRequest)
{
_extensionsPerRequest = extensionsPerRequest;
}
public IExtensions Extensions
{
get { return _extensionsPerRequest(); }
}
}
然后,在您的Autofac注册中:
builder.Register<Func<IExtensions>>(c => RequestContainer.Resolve<IExtensions>());