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

时间:2016-10-30 13:40:06

标签: c# asp.net asp.net-mvc-4 autofac

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

INTERFACE

public interface IBreadCrumbImage
{
    string GetImage();
}

CLASS(为简洁起见)

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

GLOBAL.ASAX.CS(Autofac registration)

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

我是否在使用SingleInstance注册了这个错误,或者这是因为我没想到它会这样做,而且我必须要有一些与构建器相关的基本解析器那是在Global.asax.cs中创建的?

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

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

1 个答案:

答案 0 :(得分:2)

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

如果从断点处查看调用堆栈,我猜你是否会看到MVC模型绑定在实例化BreadCrumbImage,而不是Autofac。我在Autofac设置中的任何地方都没有看到您使用action parameter injection机制,如果您是,您仍然会在调用堆栈中看到MVC模型绑定,因为您没有&#39 ; t注册BreadCrumbImage本身 - 您将其注册为IBreadCrumbImage,这样Autofac就会将其解析为。您无法使用您显示的注册解析容器中的具体BreadCrumbImage