Question

I am quite sure I am missing a very basic and simple thing here.

I am using Autofac and it's multitenant container as below

var builder = new ContainerBuilder();
// Registratino of modules here
var container = builder.Build();

var tenantStrategy = new AppSettingsTenantIdentifier(appSettings);
var mtc = new MultitenantContainer(tenantStrategy, container);

//Registration of tenant specific modules here

var resolver = new AutofacWebApiDependencyResolver(mtc);

GlobalConfiguration.Configuration.DependencyResolver = resolver;

This is called from Application_Start. After above is called, I try to resolved one of the registered classes as below

var webApiConfig = GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof (WebApiConfig)) as WebApiConfig;

One of the dependencies on this class is registered as InstancePerAPiRequest. At this point I get following error.

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. 

I am not sure how can I fix this. I Know that I can create a new lifetime scope with tag AutofacWebRequest and then resolve using that lifetime scope but that does not look right to me.

Was it helpful?

Solution

If you register something as InstancePerRequest or InstancePerApiRequest then you can't resolve it outside of a request.

If you need to resolve a dependency outside of a request lifetime (outside an actual API request), choose a different lifetime for it. InstancePerLifetimeScope is very close to InstancePerApiRequest and will work on a per-request basis, too.

But be careful: If you resolve something outside a request from the container and it is IDisposable then the object will stick around for the lifetime of the application because Autofac will hold onto it and try to dispose it for you. If you're unaware of the behavior, this can be a slow memory leak. You can read more about that on the Autofac wiki.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top