Обновление: Имеется официальный Autofac OWIN nuget package и a page with some docs.
Оригинал:
Там проект, который решает проблему IoC и интеграции Owin называется DotNetDoodle.Owin.Dependencies доступной через NuGet. В основном Owin.Dependencies
является адаптером контейнера IoC в конвейере OWIN.
код запуска образца выглядит следующим образом:
public class Startup
{
public void Configuration(IAppBuilder app)
{
IContainer container = RegisterServices();
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute("DefaultHttpRoute", "api/{controller}");
app.UseAutofacContainer(container)
.Use<RandomTextMiddleware>()
.UseWebApiWithContainer(config);
}
public IContainer RegisterServices()
{
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterOwinApplicationContainer();
builder.RegisterType<Repository>()
.As<IRepository>()
.InstancePerLifetimeScope();
return builder.Build();
}
}
Где RandomTextMiddleware
является реализация OwinMiddleware
класса от Microsoft.Owin.
«Метод Invoke класса OwinMiddleware будет вызываться при каждом запросе, и мы можем решить, есть ли обработать запрос, передать запрос следующего промежуточного слоя или сделать оба. Метод Invoke получает экземпляр IOwinContext и мы можем перейти к области зависимости по запросу через экземпляр IOwinContext ».
Sample код RandomTextMiddleware
выглядит следующим образом:
public class RandomTextMiddleware : OwinMiddleware
{
public RandomTextMiddleware(OwinMiddleware next)
: base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
IServiceProvider requestContainer = context.Environment.GetRequestContainer();
IRepository repository = requestContainer.GetService(typeof(IRepository)) as IRepository;
if (context.Request.Path == "/random")
{
await context.Response.WriteAsync(repository.GetRandomText());
}
else
{
context.Response.Headers.Add("X-Random-Sentence", new[] { repository.GetRandomText() });
await Next.Invoke(context);
}
}
}
Для получения дополнительной информации посмотрите на original article.
И вопрос в том, что? Кстати, почему вы регистрируете «SecurityService» после того, как контейнер был создан? –
отредактированный образец для переноса службы безопасности до. Это был просто пример. Я пытаюсь выяснить, поддерживает ли AutoFac конвейер OWIN. – Shane
Доступен пакет Autofac OWIN по состоянию на февраль 2014 года. https://www.nuget.org/packages/Autofac.Owin/ На момент написания статьи все еще в предварительном порядке, поэтому не забудьте изменить выпадающий список, если вы не можете найти его в VS UI. –