开发者

Autofac: Reference from a SingleInstance'd type to a HttpRequestScoped

开发者 https://www.devze.com 2022-12-26 17:15 出处:网络
I\'ve got an application where a shared object needs a reference to a per-request object. Shared:Engine

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>());
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号