2013-09-30 51 views
2

我試圖在現有的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能夠遍歷整個樹中的依賴關係樹並使用相同的生命週期。 (即,如果一個單身人士包含一個瞬態,那麼兩者都應該是瞬態的)

這是預期的行爲?我究竟做錯了什麼?

+1

單例不能包含瞬態。 容器與基於一個消費者的已配置生命週期沒有區別,因爲依賴項可能有多個消費者。 如果一個依賴項被單例使用,它本身應該被配置爲一個單例。 一個瞬態過程當然也可以使用單例依賴。 – David

回答

0

您可以使用依賴關係到IBarFactory而不是IBarIBarFactory將有sigleton生活方式,它將返回IBar實例,它將從容器中解析出來。

0

由於代碼試圖解析單個實例對象中的InstancePerHttpRequest對象,因此引發了異常。

通過一些修改,您可以實現此目的。

  1. 轉換美孚接受Func鍵
public class Foo { 
    private readonly Func _barFunc; 

    public Foo(Func barFunc) { 
     _barFunc = barFunc; 
    } 
}
  • 使用DependencyResolver.Current目的是解決Func鍵
  • builder.Register(c => new Foo(() => DependencyResolver.Current.GetService())) 
        .As() 
        .SingleInstance();

    如需更多提示上Autofac的範圍,看看這個鏈接 Autofac per request scope