如何将Autofac与Web Api 2和Owin集成?

时间:2014-06-25 08:22:27

标签: c# asp.net-mvc-5 autofac owin asp.net-web-api2

我正在使用此软件包将Autofac与我的WebApi Owin应用程序集成:

https://www.nuget.org/packages/Autofac.WebApi2.Owin

关注这篇文章:

http://alexmg.com/owin-support-for-the-web-api-2-and-mvc-5-integrations-in-autofac/

我在Startup.cs中的代码如下所示:

        var config = new HttpConfiguration();

        IContainer container = EngineContext.InitializeEngine();

        var dependencyResolver = new AutofacWebApiDependencyResolver(container);
        config.DependencyResolver = dependencyResolver;

        app.UseAutofacMiddleware(container);
        app.UseAutofacWebApi(config);

        WebApiConfig.Register(config);
        app.UseWebApi(config);

无论我如何旋转它,重新排列代码或其他任何东西,Autofac都无法解决任何问题。在Owin之前,我的Global.asax方法运行得很好:

    protected void Application_Start()
    {
        IContainer container = EngineContext.InitializeEngine();

        var dependencyResolver = new AutofacWebApiDependencyResolver(container);
        GlobalConfiguration.Configuration.DependencyResolver = dependencyResolver;

        GlobalConfiguration.Configure(WebApiConfig.Register);
    }

我错过了什么?

由于

1 个答案:

答案 0 :(得分:23)

确定,

我明白了。 Autofac Owin集成实际上创建了一个Owin liftimescope,它可以通过整个Owin管道获得,因此可用于中间件并将此lifetimescope扩展到HttpRequestMessage。这是标有AutofacWebRequest标记的lifetimescope。

因此,所有以前的WebApi集成代码仍然需要在应用程序启动时执行。我已经包括:

    var dependencyResolver = new AutofacWebApiDependencyResolver(container);
    config.DependencyResolver = dependencyResolver;

但错过了:

var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).InstancePerRequest();

在EngineContext.Initialize方法中,该方法通过构建器执行所有注册。

在这里您可以找到有关如何将Autofac与WebApi集成的更多信息,这显然也需要在Owin的情况下完成:

https://code.google.com/p/autofac/wiki/WebApiIntegration

我希望这很有用!