我不确定是不是只有我一个人,但我感觉 ASP.NET MVC 控制器中使用的构造函数注入会导致不必要的资源消耗。
在创建控制器时,仍然需要创建未用于特定 Web 请求的组件。这就像在我渴了牛奶的时候买了摊位牛奶和果汁,然后我就把果汁扔掉了。
比较控制器的构造函数注入和服务定位器的这些示例,以澄清我的担忧。
构造函数注入,创建了展位deps,但只使用了一个。
public class MyController : Controller
{
private readonly IDep1 _dep1;
private readonly IDep2 _dep2;
public MyController(IDep1 dep1, IDep2 dep2)
{
_dep1 = dep1;
_dep2 = dep2;
}
public ActionResult Index()
{
_dep1.MakeStuff();
return View();
}
public ActionResult PageTwo()
{
_dep2.MakeStuff();
return View();
}
}
服务定位器,每个 dep 仅在使用时创建。
public class MyController : Controller
{
public ActionResult Index()
{
var dep1 = ServiceLocator.Resolve<IDep1>();
dep1.MakeStuff();
return View();
}
public ActionResult PageTwo()
{
var dep2 = ServiceLocator.Resolve<IDep2>();
dep2.MakeStuff();
return View();
}
}
请注意,IoC 容器(由于许多原因是有益的)仍然可以用于服务定位器模式。我不希望这是围绕 IoC 和容器框架的讨论,也没有构造函数注入的其他好处(依赖关系的清晰可见性等)。我关心的是构造函数注入模式以及它在 ASP.NET MVC 控制器情况下如何浪费资源。
我想这里的主要问题是: 对于上述场景(ASP.NET MVC 控制器),Service Locator 是更好的解决方案性能吗?