2013-11-19 4 views
10

Это для MVC5 и нового конвейера. Я не могу найти хороший пример нигде.Как вы выполняете инъекцию зависимостей с помощью AutoFac и OWIN?

public static void ConfigureIoc(IAppBuilder app) 
{ 
    var builder = new ContainerBuilder(); 
    builder.RegisterControllers(typeof(WebApiApplication).Assembly); 
    builder.RegisterApiControllers(typeof(WebApiApplication).Assembly); 
    builder.RegisterType<SecurityService().AsImplementedInterfaces().InstancePerApiRequest().InstancePerHttpRequest(); 

    var container = builder.Build(); 
    app.UseAutofacContainer(container); 
} 

Приведенный выше код не вводит. Это работало хорошо, прежде чем пытаться переключиться на OWIN-конвейер. Просто не можете найти информацию о DI с OWIN.

+2

И вопрос в том, что? Кстати, почему вы регистрируете «SecurityService» после того, как контейнер был создан? –

+0

отредактированный образец для переноса службы безопасности до. Это был просто пример. Я пытаюсь выяснить, поддерживает ли AutoFac конвейер OWIN. – Shane

+0

Доступен пакет Autofac OWIN по состоянию на февраль 2014 года. https://www.nuget.org/packages/Autofac.Owin/ На момент написания статьи все еще в предварительном порядке, поэтому не забудьте изменить выпадающий список, если вы не можете найти его в VS UI. –

ответ

10

Обновление: Имеется официальный 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.

+0

Пытаетесь реализовать это, но не можете понять, какова цель RandomTextMiddleware? Я не хочу этого, просто хочу зарегистрировать свои зависимости через инъекцию. – Shane

+1

@Shane «RandomTextMiddleware» просто для примера, показывающего, что вы можете пройти через конвейер и получать свои зависимости повсюду. Таким образом, вы можете просто опустить это. – tugberk

+0

@tugberk Итак, вы говорите для этого, просто для того, чтобы опустить это. Используйте линию, и она должна работать? app.UseAutofacContainer (контейнер) . Использовать () .UseWebApiWithContainer (config); – Shane

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