ASP.NET Autofac Singleton运行两次构造函数注入

我不确定我的期望是否错误。 我使用的是ASP.NET MVC(非核心)和Autofac。 我有一个图像出现在我的网站的每个页面上,我已经创建了一个服务来返回一个像这样的随机图像名称

接口

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().As().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的构造函数中加载图像,它读取文件并将它们放入一个数组中 – 在app启动时不需要多次执行,而GetImages只需要从数组中获取rnd)。

我是否在SingleInstance中注册了这个错误,或者这是不能正常工作,因为我期待它,我将不得不有一些与Global.asax.cs中创建的构建器绑定的基本解析器?

更新:回答,谢谢Travis。 需要把它放到autofac配置中,一切都像魅力一样。

 builder.RegisterType() .As() .WithParameter("injectActionMethodParameters", true); 

查看您提供的控制器,您不使用构造函数注入。 Index方法是一个action方法,而不是一个构造函数。 此外,它要求BreadCrumbImage而不是IBreadCrumbImage

如果从断点处查看调用堆栈,我猜你会看到MVC模型绑定在实例化BreadCrumbImage而不是Autofac。 我没有在你的Autofac设置中看到你正在使用动作参数注入机制的任何地方,如果你仍然在调用堆栈中看到MVC模型绑定,因为你没有注册BreadCrumbImage本身 – 你注册了它作为IBreadCrumbImage ,这是IBreadCrumbImage唯一能解决它的问题。 您将无法使用您显示的注册解析容器中的具体BreadCrumbImage