我試圖在現有的MVC4應用程序中使用依賴注入。我已經安裝了Autofac 3.1.1和Autofac MVC4集成3.1.0。我一直很高興它迄今爲止 - 不過,我在與請求範圍界定困難的一次性服務:在「Singleton」中解析InstancePerHttpRequest
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() { }
}
}
}
如果我在一個控制器構造要求伊巴爾的實例,一切都按預期工作 - 一個每次製作新酒吧並每次銷燬。但是,如果我在我的控制器構造要求富我得到以下信息:
「不帶標籤匹配‘AutofacWebRequest’的範圍是從該實例是要求 範圍可見」
據我所知,Autofac正在創建一個新的Foo作爲單例。雖然這看起來很明顯(我要求它是一個單例),但我期望Autofac能夠遍歷整個樹中的依賴關係樹並使用相同的生命週期。 (即,如果一個單身人士包含一個瞬態,那麼兩者都應該是瞬態的)
這是預期的行爲?我究竟做錯了什麼?
單例不能包含瞬態。 容器與基於一個消費者的已配置生命週期沒有區別,因爲依賴項可能有多個消費者。 如果一個依賴項被單例使用,它本身應該被配置爲一個單例。 一個瞬態過程當然也可以使用單例依賴。 – David