Autofac: ссылка из типа SingleInstance на HttpRequestScoped - PullRequest
1 голос
/ 08 апреля 2010

У меня есть приложение, где общему объекту нужна ссылка на объект для каждого запроса.

Shared:      Engine
                |
Per Req:  IExtensions()
                |
             Request

Если я попытаюсь вставить IExtensions непосредственно в конструктор Engine,даже как Lazy(Of IExtension), я получаю «Нет соответствия области видимости [Запрос] из области, в которой был запрошен экземпляр».исключение, когда он пытается создать экземпляр каждого IExtension.

Как создать экземпляр HttpRequestScoped и затем внедрить его в общий экземпляр?Request фабрика (и, следовательно, Engine в RequestFactory)?

1 Ответ

1 голос
/ 08 апреля 2010

Из-за общих требований к времени жизни Engine вы не можете внедрить в него расширения области запроса. То, что вы могли бы иметь, - это метод или свойство в Engine, которое будет активно разрешать коллекцию расширений из текущей области запроса.

Итак, сначала позвольте Engine взять зависимость конструктора:

public class Engine
{
    public Engine(..., Func<IExtensions> extensionsPerRequest) 
    {
        _extensionsPerRequest = extensionsPerRequest;
    }


    public IExtensions Extensions
    {
       get { return _extensionsPerRequest(); }
    }
 }

А затем, в вашей регистрации Autofac:

builder.Register<Func<IExtensions>>(c => RequestContainer.Resolve<IExtensions>());
...