Autofac: Reference from a SingleInstance'd type to a HttpRequestScoped
I've got an application where a shared object needs a reference to a per-request object.
Shared: Engine 开发者_运维技巧 | Per Req: IExtensions() | Request
If i try to inject the IExtensions
directly into the constructor of Engine
, even as Lazy(Of IExtension)
, I get a "No scope matching [Request] is visible from the scope in which the instance was requested." exception when it tries to instantiate each IExtension
.
How can I create a HttpRequestScoped instance and then inject it into a shared instance?
Would it be considered good practice to set it in the Request
's factory (and therefore inject Engine
into RequestFactory
)?
Due to the shared lifetime requirements of Engine
you cannot inject request-scoped extensions into it. What you could have is a method or property on Engine that will actively resolve a collection of extensions from the current request scope.
So first, let Engine
take a constructor dependency:
public class Engine
{
public Engine(..., Func<IExtensions> extensionsPerRequest)
{
_extensionsPerRequest = extensionsPerRequest;
}
public IExtensions Extensions
{
get { return _extensionsPerRequest(); }
}
}
And then, in your Autofac registration:
builder.Register<Func<IExtensions>>(c => RequestContainer.Resolve<IExtensions>());
精彩评论