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

本文关键字:两次 构造函数 注入 NET autoface Singleton 运行 ASP | 更新日期: 2023-09-27 18:15:30

我不确定我的期望是否错了。我用的是ASP。. NET MVC(不是core)和Autofac。我有一个图像,出现在我的网站的每一页,我已经创建了一个服务,以返回一个随机图像的名称,如

界面

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));
}
控制器

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();
    }
}

所有这些工作,我得到我的图像随机显示。但是,通过设置断点,每次访问这个breadcrumimage服务时都会被实例化。我想有这个实例化一次(图像的加载是在BreadCrumbImage的构造函数中完成的,它读取文件并将它们放入数组中——不需要在应用程序启动时不止一次这样做,而GetImages只是从数组中抓取rnd)。

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

更新:回答,谢谢特拉维斯。我需要把它放到autofac配置中,一切都很顺利。

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

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

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

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