【发布时间】:2012-03-30 07:00:08
【问题描述】:
一般来说,使用方法但没有字段或属性的类的实例化是否有很多开销?
我正在开发一个 ASP.NET MVC 应用程序,该应用程序大量使用构造函数注入,到目前为止,一些控制器有多达 10 个依赖项。但由于依赖项数量众多,我使用了一个 IMyAppServiceProvider 接口和类,通过 MVC 3 中的 DependencyResolver 提供对所有依赖项的通用访问。
我删除了所有应用程序特定的代码,并使用我的基本设置创建了一个Gist(但这不包括下面提到的 BaseController 设置)。
我还创建了一个接受IMyAppServiceProvider 的 BaseController 类。所有控制器都继承自这个基类。基类采用IMyAppServiceProvider 对象并为所有各种服务提供受保护的变量。代码如下所示:
public class BaseController
{
protected IService1 _service1;
protected IService2 _service2;
protected IService3 _service3;
// ...
public BaseController(IMyAppServiceProvider serviceProvider)
{
_service1 = serviceProvider.GetService<IService1>;
_service2 = serviceProvider.GetService<IService2>;
_service3 = serviceProvider.GetService<IService3>;
// ...
}
}
这使得控制器的代码“干净利落”。没有私有/受保护变量,构造函数中没有赋值,并且服务由基类受保护变量引用。 但是,每个请求都会实例化我的应用程序使用的每一个服务,无论特定控制器是否使用所有这些服务。
我的服务很简单,只包含带有一些业务逻辑和数据库交互的方法调用。它们是无状态的,没有类字段或属性。因此,实例化应该很快,但我想知道这是否是最佳实践(我知道这是一个加载术语)。
【问题讨论】:
-
一如既往,首先是个人资料。但是,我猜测解决依赖关系比实例化它们慢几个数量级。
-
@insta 哇,我没有透过树林看到森林。但是 Ninject 和/或其他 IoC 容器缓存依赖解析吗?
-
我在下面添加了一个可以帮助你的答案......我之前也遇到过同样的问题。大多数人(包括我自己)不知道您可以覆盖控制器工厂 ASP.NET MVC 用于创建控制器。自定义容器可以紧密集成您的 IoC 容器,并根据需要处理依赖项。
-
每个类 10 个依赖项?请阅读这个问题:stackoverflow.com/questions/9686567/dependency-injection-what-to-do-when-you-have-a-lot-of-dependencies,以及这个问题:stackoverflow.com/questions/2420193/…。
标签: c# .net asp.net-mvc dependency-injection service-locator