1

我使用 NuGet 将 ASP.NET Web API RC 添加到我的 MVC3 项目中:

Install-Package AspNetWebApi

然后我配置了它。在Global.asax.cs

// configure regular controllers
var configuration = GlobalConfiguration.Configuration;
var container = Bootstrapper.ConfigureContainer(configuration);
containterProvider = new ContainerProvider(container);
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

// Set the dependency resolver implementation for Web API.
var resolver = new AutofacWebApiDependencyResolver(container);
configuration.DependencyResolver = resolver;

Boostrapper.ConfigureContainer(...)我补充说:

// I register my types as InstancePerLifetimeScope() 
// but I also tried .InstancePerHttpRequest().InstancePerApiRequest()
// to the same end
builder.RegisterType<SomeService>()
    .AsImplementedInterfaces().InstancePerLifetimeScope();
// Register API controllers using assembly scanning.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterWebApiFilterProvider(config);

这在此处此处进行了描述。

我还使用 NuGet更新了AutofacAutofac.Web、包并安装了包。Autofac.Mvc3Autofac.WebApi

使用此配置,我尝试运行我的 ApiController 并收到以下错误:

从请求实例的范围中看不到具有与“httpRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在被 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身.

然后,当我阅读 Alex Meyer-Gleaves 的评论时:

我怀疑您正在使用带有 MVC3 的 Web API 包,这导致了问题。在 MVC3 集成中,InstancePerHttpRequest 生命周期范围的标记是“httpRequest”。在 MVC4 Beta 和 Web API Beta 包中,我更改了 InstancePerHttpRequest 和 InstancePerApiRequest 以使用通用标签“AutofacWebRequest”。您可以使用 Autofac.Mvc4 从 NuGet 获取 MVC4 集成包。

带有评论的源文章

所以按照亚历克斯的建议,我得到了这个包Autofac.Mvc4,但它只适用于 Mvc4,我的项目无法构建。然后我获取了 Autofac 的源代码来构建Autofac.Mvc4Mvc3:

hg clone https://code.google.com/p/autofac/ --branch "MVC4 beta" C:\my\path

使用此程序集作为我的参考后ApiController开始工作,但常规Controllers工作仅适用于单个控制器操作调用。当视图调用 Html.RenderAction(...) 并且当我刷新或导航到另一个控制器操作时,它会因以下错误而崩溃:

从请求实例的范围中看不到带有与“AutofacWebRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在被 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身.

我认为从Autofac.Mvc4针对 Mvc3 的 2.6.2.859 版本的最新源构建可能会有所帮助,但我找不到源。或者这里可能有其他问题?

4

1 回答 1

9

我发现了问题。我还曾经Autofac.Integration.Web将依赖项注入到自定义成员资格和角色提供程序中。但是WebLiftime.cs里面有这样一行:

public static readonly object Request = "httpRequest";

一旦我将其更改为:

public static readonly object Request = "AutofacWebRequest";

并使用构建的组件一切正常,我没有收到任何错误:)

我相信这个常数值应该与所有项目中的相同Autofac.Integration.WebAutofac.Integration.Mvc并且'Autofac.Integration.WebApi对于 Mvc4,所以这应该是一个错误。

于 2012-06-28T12:03:44.753 回答