2016-04-27 5 views
0

Я пытаюсь сделать эту работу:Получение услуги PerRequest из компонента SingleInstance

builder.RegisterInstance(EngineFactory.Instance).SingleInstance().ExternallyOwned(); 
builder.Register(c => 
{ 
    EngineFactory engineFactory = DependencyResolver.Current.GetService<EngineFactory>(); 
    //EngineFactory engineFactory = c.Resolve<EngineFactory>(); 
    IEngineService engineService = engineFactory.GetService(); 
    return engineService; 
}).InstancePerRequest().As<IEngineService>(); 

И я получаю сообщение об ошибке:

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. 

Чтобы сделать вещи ясно, я хочу EngineFactory к быть единственным (созданным внешним), а IEngineService - экземпляром запроса Per (web) Request.

Ошибка при вводе объекта управления IEngineService.

Я не понимаю, что я делаю неправильно ...

+0

Не могли бы вы поделиться трассировкой стека исключения? –

ответ

0

код вы сообщаете правильно, AFAICT.

В частности:

// this is ok. 
builder.RegisterInstance(EngineFactory.Instance).SingleInstance().ExternallyOwned(); 

// you can use c.Resolve<EngineFactory>() and probably you should, 
// but really, is the same as your code 
builder.Register(c => c.Resolve<EngineFactory>().GetService()) 
    .InstancePerRequest().AsImplementedInterfaces(); 

сообщение об ошибке вы получаете то, что вы зафиксируете ваше разрешение IEngineService к Http Request. В Autofac это управляется с помощью меченых областей, то есть через контейнеры, которые отвечают за отслеживание и удаление объектов. Тег с меткой - это просто область с именем.

При использовании экземпляра InstancePerRequest Autofac выполняет поиск области AutofacWebRequest, которая автоматически создается и удаляется для вас интеграцией Autofac/Asp.Net, которая, вероятно, неправильно настроена.

Ваша проблема почти наверняка заключается в конфигурации интеграции Autofac/Asp.Net.

Итак, обратитесь к guide on the website и попросите снова в случае возникновения проблем.

Последнее: если вы еще этого не сделали, прочитайте Autofac Lifetime Primer. Это чистое золото, если вы работаете с Autofac.

Редактировать: случайно вы на Asp.Net Core? Если это так, here вы можете найти примечание, чтобы НЕ использовать InstancePerRequest.