问题
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
)?
回答1:
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>());
来源:https://stackoverflow.com/questions/2599566/autofac-reference-from-a-singleinstanced-type-to-a-httprequestscoped