问题
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