2016-10-30 75 views
0

我不確定我的期望是否錯誤。我正在使用ASP.NET MVC(不是核心)和Autofac。我有我的網站的每一頁上顯示的圖像,我創建了一個服務返回一個隨機圖像的名字,像這樣ASP.NET Autofac Singleton運行兩次構造函數注入

接口

public interface IBreadCrumbImage 
{ 
    string GetImage(); 
} 

CLASS(剪斷,爲了簡潔)

public class BreadCrumbImage : IBreadCrumbImage 
{ 
    public string GetImage() 
    { 
     return ImageUrl; 
    } 
} 

的global.asax.cs(Autofac註冊)

protected void Application_Start() 
{ 
     var builder = new ContainerBuilder(); 
     builder.RegisterControllers(typeof(MvcApplication).Assembly); 
     builder.RegisterType<BreadCrumbImage>().As<IBreadCrumbImage>().SingleInstance(); 
     var container = builder.Build(); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
} 

CONTROLLER

public class HomeController : Controller 
{ 
    private IBreadCrumbImage _breadCrumbImage; 

    public ActionResult Index(BreadCrumbImage breadCrumbImage) 
    { 
     _breadCrumbImage = breadCrumbImage; 
     var x = _breadCrumbImage.GetImage(); 
     ViewBag.BreadCrumbImage = "/img/BreadCrumbs/" + x; 
     return View(); 
    } 
} 

所有這些工作,我得到我的IMAGE隨機顯示..但是,設置斷點,這個BreadCrumbImage服務被實例化每次訪問。我想要實例化一次(圖像的加載是在BreadCrumbImage的構造函數中完成的,它讀取文件並將它們放入數組中 - 在啓動應用程序時不需要這樣做,並且GetImages只是從數組中獲取rnd)。

我在SingleInstance中註冊了這個錯誤,還是因爲我期待它而不工作,我將不得不擁有一些與Global.asax中創建的生成器綁定的基本解析器。 CS?

更新:答案,謝謝特拉維斯。需要將其加入到autofac配置中,並且所有工作都像魅力一樣。

builder.RegisterType<ExtensibleActionInvoker>() 
     .As<IActionInvoker>() 
     .WithParameter("injectActionMethodParameters", true); 

回答

2

看着你提供的控制器,你沒有使用構造函數注入。Index方法是一個動作方法,而不是構造函數。此外,它要求BreadCrumbImage而不是IBreadCrumbImage

如果從斷點看看調用堆棧,我猜你會看到MVC模型綁定正在實例化BreadCrumbImage,而不是Autofac。我沒有看到Autofac設置中的任何地方使用action parameter injection機制,並且如果您仍然看到MVC模型綁定在調用堆棧中,因爲您沒有將BreadCrumbImage註冊爲自己 - 您將其註冊爲IBreadCrumbImage所以這是Autofac將解決它的唯一一件事。使用您顯示的註冊,您將無法通過容器解析具體的BreadCrumbImage

+0

你是我的英雄。更新我缺少的問題,是的,你是正確的,MVC做了所有的工作,而不是Autofac。這也回答了我的另一個開放問題。真的非常感謝你! – plankalkul

+0

你應該關閉你的另一個問題,所以大家不要試圖繼續回答。 –