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);
看看您提供的控制器,您没有使用构造函数注入。 Index
方法是一个动作方法,而不是构造函数。此外,它要求的是BreadCrumbImage
而不是IBreadCrumbImage
。
如果你从你的断点看调用堆栈,我猜你会看到MVC模型绑定继续实例化BreadCrumbImage
,而不是autofacc。我在你的Autofac设置中没有看到任何地方你在使用动作参数注入机制,如果你是,你仍然会在调用堆栈中看到MVC模型绑定,因为你没有将BreadCrumbImage
注册为它本身-你将它注册为IBreadCrumbImage
,所以这是Autofac将它解析为的唯一东西。您将无法使用您正在显示的注册从容器中解析具体的BreadCrumbImage
。