【问题标题】:IoC - Delay initialization of services in controller until requiredIoC - 延迟控制器中服务的初始化,直到需要
【发布时间】:2013-09-06 21:41:23
【问题描述】:

在 ASP.NET MVC 应用程序中,我从我的控制器调用“服务”方法。

通常,名为ReportingController 的控制器调用来自ReportingServices 的方法。服务类使用AutofacMvc.Integration 进行实例化。

builder.RegisterControllers(Assembly.GetExecutingAssembly());

然后将服务注入到控制器构造函数中。

public ReportingController(ReportingServices service)

到目前为止一切顺利。 但有时,控制器需要调用其他服务的方法。我更改了 autofac 配置:

builder.RegisterControllers(Assembly.GetExecutingAssembly())
       .PropertiesAutowired(PropertyWiringOptions.PreserveSetValues);

并向控制器添加属性:

public CommonServices CommonService { get; set; } // new properties
public ReportingController(ReportingServices service) {} // existing ctor

然而现在发生的事情是,当控制器被实例化时,所有属性也被设置,即使它们从未被特定的 ActionMethod 使用。

我如何告诉 Autofac 将属性的实例化延迟到需要时,或者我可能根本不应该关心这种不必要的初始化?

【问题讨论】:

  • 你的控制器可能有太多的责任。
  • @ta.speot.is:你的意思是在控制器和服务之间建立一对一的关系是一种很好的做法吗?如果控制器突然需要来自另一个服务的某些东西,这可能应该在服务本身而不是控制器中处理?

标签: asp.net-mvc autofac


【解决方案1】:

Autofac 支持Lazy<T> out of the box

所以你只需要将你的属性声明为:

public Lazy<CommonServices> CommonService { get; set; } 

并且 Autofac 不会实例化您的 CommonServices,直到您不使用 CommonService.Value 访问您的 Lazy 值。

【讨论】:

  • 直到您无法访问...?
  • @Alex Autofac 不会创建您的 CommonServices 直到您不访问它,所以在此示例中:CommonServiceValue 属性所以如果您不写CommonService.Value 然后 Autofac 不会创建你的 CommonServices
猜你喜欢
  • 1970-01-01
  • 2012-09-03
  • 2013-05-25
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 2020-05-10
  • 1970-01-01
相关资源
最近更新 更多