Когда вы используете интеграцию 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
, поэтому вы можете ввести его на заводе и применить свою логику.