C# 传递函数<;T>;在使用Unity IoC和MVC时,控制器结构的优势是什么?

C# 传递函数<;T>;在使用Unity IoC和MVC时,控制器结构的优势是什么?,c#,asp.net-mvc,entity-framework,dependency-injection,unity-container,C#,Asp.net Mvc,Entity Framework,Dependency Injection,Unity Container,我正在看一个如何使用MVC设置Unity IoC的示例,注意到有人推荐使用Func的参数。我相信这样做的好处是,这有点像延迟加载服务,如果它从未被调用,它将永远不会被执行,也不会消耗任何资源 private readonly Func<IUserService> _userService; public CourseController(Func<IUserService> userService) { this._userService = u

我正在看一个如何使用MVC设置Unity IoC的示例,注意到有人推荐使用Func的参数。我相信这样做的好处是,这有点像延迟加载服务,如果它从未被调用,它将永远不会被执行,也不会消耗任何资源

 private readonly Func<IUserService> _userService;

 public CourseController(Func<IUserService> userService)
 {
         this._userService = userService;
 }

有人能给我解释一下区别吗?它真的更有效吗?

使用
Func
而不是
IUserService
的原因之一,因为依赖类型是避免循环依赖

我回答了这么多问题,并建议使用
Func
而不是
ISession

如果没有循环依赖,我更喜欢使用简单的类型


如果依赖项是
Func
,我不确定是否很容易在每个web请求中拥有
IUserService

实例,这是使用
Func
而不是
IUserService
的原因之一,因为依赖项类型是避免循环依赖项

我回答了这么多问题,并建议使用
Func
而不是
ISession

如果没有循环依赖,我更喜欢使用简单的类型


如果依赖项是
Func
,我不确定是否很容易获得
IUserService

的每个web请求实例,为什么不
Lazy
?@TimS.:可能是因为Unity 2支持自动解析
Func
。Unity 3现在还支持
Lazy
。如果对象在初始化时没有做太多的工作,那么对象初始化会非常快。考虑构造函数中的太多内容和许多变量初始化。当资源或性能毫无疑问地受到服务初始化的影响时,请使用这样的结构。它确实增加了复杂性,复杂性在维护中总是有代价的。此外,在生命周期管理方面,it部门还会跟踪IoC容器。通过延迟初始化,操作方法负责何时以及如何处理对象,这可能会导致在控制器中重复使用
。为什么不
延迟
?@TimS.:可能是因为Unity 2支持自动解析
Func
。Unity 3现在还支持
Lazy
。如果对象在初始化时没有做太多的工作,那么对象初始化会非常快。考虑构造函数中的太多内容和许多变量初始化。当资源或性能毫无疑问地受到服务初始化的影响时,请使用这样的结构。它确实增加了复杂性,复杂性在维护中总是有代价的。此外,在生命周期管理方面,it部门还会跟踪IoC容器。通过延迟初始化,动作方法负责何时以及如何处理对象,这可能会导致控制器中重复使用
 private readonly IUserService _userService;

 public CourseController(IUserService userService)
 {
         this._userService = userService;
 }