2013-08-08 3 views
1

Я пытаюсь сделать интегрировать Hyprlinkr в проект WebAPI с Autofac.
Я начал писать пользовательские IHttpControllerActivator но я получаю следующее исключение при попытке разрешить контроллер:Интеграция Hyprlinkr с Autofac

Нет рамки с сопрягая Tag «AutofacWebRequest» виден из сферы, в которых экземпляр запрошен. Как правило, это указывает на то, что компонент, зарегистрированный в соответствии с HTTP-запрос запрашивается по в SingleInstance() компонент (или подобный сценарий.) В рамках интеграции веб- всегда запрашивать зависимости от DependencyResolver.Current или ILifetimeScopeProvider.RequestLifetime, никогда не из самого контейнера.

Вот как класс выглядит следующим образом:

public class AutofacControllerActivator : IHttpControllerActivator 
{ 
    private readonly IContainer _container; 

    public AutofacControllerActivator(IContainer container) 
    { 
     if (container == null) throw new ArgumentNullException("container"); 
     _container = container; 
    } 

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
    { 
     var linker = _container.ResolveOptional<RouteLinker>(
      new TypedParameter(typeof(HttpRequestMessage), request)); 

     return (IHttpController) _container.Resolve(controllerType, 
      new TypedParameter(typeof(IResourceLinker), linker)); 
    } 
} 

Как получить вопрос Жизненный цикл фиксированной?

+0

Как зарегистрировать свой 'RouteLinker' в контейнере? И если он уже был зарегистрирован, почему вам нужен пользовательский «AutofacControllerActivator», потому что если «RouteLinker» находится в контейнере, вы можете использовать его в своем конструкторе контроллера? – nemesv

+0

«RouteLinker» имеет зависимость от времени выполнения от 'request'. – David

ответ

1

Вам не нужно писать самостоятельно IHttpControllerActivator, так как вы можете зарегистрировать RouteLinker себя в контейнере.

Вам просто нужна помощь метода RegisterHttpRequestMessage, который делает возможным удаление HttpRequestMessage из контейнера.

Так что ваша RouteLinker регистрация будет выглядеть примерно так:

builder.RegisterHttpRequestMessage(GlobalConfiguration.Configuration); 
builder.Register(c => new RouteLinker(c.Resolve<HttpRequestMessage>())) 
     .InstancePerApiRequest(); 

Теперь вы можете положиться на RouteLinker в контроллерах:

public MyController : ApiController 
{ 
    public MyController(RouteLinker routeLinker) 
    { 
      //do stuff with routeLinker 
    } 
} 
+0

Спасибо, вот и все! Я пошел для 'builder.RegisterType () .As (). InstancePerApiRequest();' – David

Смежные вопросы