我使用 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更新了Autofac
、Autofac.Web
、包并安装了包。Autofac.Mvc3
Autofac.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.Mvc4
Mvc3:
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 版本的最新源构建可能会有所帮助,但我找不到源。或者这里可能有其他问题?