我正在尝试在现有的 MVC4 应用程序中开始使用依赖注入。我已经安装了 Autofac 3.1.1 和 Autofac MVC4 集成 3.1.0。到目前为止,我对此感到非常满意 - 但是,我在请求确定一次性服务范围时遇到了困难:
namespace App_Start
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Autofac;
using Autofac.Integration.Mvc;
public static class KernelConfig
{
private static IContainer Container { get; set; }
public static void Register()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<Bar>()
.As<IBar>()
.InstancePerHttpRequest();
builder.RegisterType<Foo>()
.As<Foo>()
.SingleInstance();
Container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(Container));
}
class Foo
{
private readonly IBar _bar;
public Foo(IBar bar)
{
_bar = bar;
}
}
interface IBar
{
void DoStuff();
}
class Bar : IBar, IDisposable
{
public void DoStuff() { }
public void Dispose() { }
}
}
}
如果我在控制器构造函数中请求 IBar 的实例,一切都会按预期工作 - 每次都会创建一个新 Bar 并每次都销毁。但是,如果我在控制器构造函数中请求 Foo ,我会收到以下消息:
“从请求实例的范围内看不到标签匹配‘AutofacWebRequest’的范围”
据我所知,Autofac 正在创建一个新的 Foo 作为单例。虽然这看起来很明显(我要求它是一个单例),但我希望 Autofac 能够遍历依赖关系树并在整个树中使用相同的生命周期。(即如果一个单例包含一个瞬态,那么两者都应该是瞬态的)
这是预期的行为吗?我究竟做错了什么?