2016-11-14 3 views
0

Как я могу загрузить зависимость службы на основе параметра маршрута?Autofac OWIN web api - зависимость нагрузки по запросу

Мои требования разные, но я попытаюсь использовать простой пример. Пользователь может выбрать поставщика доставки (UPS, Fedex ...), и эта информация является частью модели запроса или маршрута. На основе маршрута мне нужно загрузить класс сервиса.

Как это сделать в Autofac OWIN? Помощь по этому поводу будет оценена

ответ

0

Когда вы используете интеграцию OWIN Autofac, каждый запрос создает новую область жизни, в которой зарегистрирован текущий IOwinContext, как вы можете видеть here.

Затем вы можете делегировать создание своего сервиса на завод, который будет зависеть от IOwinContext.

public class MyServiceFactory 
{ 
    private readonly IOwinContext _context; 

    public MyServiceFactory(IOwinContext context) 
    { 
     _context = context; 
    } 

    public IService Create() 
    { 
     // inspect the context and determine which service you need 
     // you could return, dependending on, let's say, the URL 
     // - UpsService() 
     // - FedexService() 
    } 
} 

Одна вещь, вы должны убедиться, что вы зарегистрировать свой завод как InstancePerLifetimeScope, так как IOwinContext будет отличаться для каждого запроса.

Нужно ли работать на слое OWIN? Это усложнит ситуацию и, возможно, немного взломает, поскольку OWIN - это действительно просто уровень HTTP, поэтому нет такой информации, как данные маршрута.

Если вы используете веб-API ASP.NET, вы можете создать заводскую установку на текущем HttpRequestMessage, если вы используете метод расширения RegisterHttpRequestMessage.
Затем вы можете получить данные о маршруте через request.GetRequestContext().RouteData. Обратите внимание, что GetRequestContext является методом расширения в пространстве имен System.Net.Http.

Если вы используете ASP.NET MVC, вы можете зарегистрировать AutofacWebTypesModule в контейнере, который сам регистрирует в контейнере довольно много типов.
Один из них - HttpRequestContext, у которого есть свойство RouteData, поэтому вы можете ввести его на заводе и применить свою логику.

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