Как вы делаете инъекцию зависимостей с помощью AutoFac и OWIN?

Это для MVC5 и нового конвейера. Я не могу найти хороший пример.

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.

Ответ 1

Обновление: Там есть официальный Autofac OWIN пакет nuget и страница с некоторыми документами.

Оригинал:
Там есть проект, который решает проблему интеграции 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."

Пример кода 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);
        }
    }
}

Для получения дополнительной информации см. оригинальную статью .