我不确定我的期望是否错误。我使用的是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);
答案 0 :(得分:2)
查看您提供的控制器,您不使用构造函数注入。 Index
方法是一个操作方法,而不是构造函数。此外,它还要求BreadCrumbImage
而不是IBreadCrumbImage
。
如果从断点处查看调用堆栈,我猜你是否会看到MVC模型绑定在实例化BreadCrumbImage
,而不是Autofac。我在Autofac设置中的任何地方都没有看到您使用action parameter injection机制,如果您是,您仍然会在调用堆栈中看到MVC模型绑定,因为您没有&#39 ; t注册BreadCrumbImage
本身 - 您将其注册为IBreadCrumbImage
,这样Autofac就会将其解析为。您无法使用您显示的注册解析容器中的具体BreadCrumbImage
。