使用方法进行类实例化的速度有多快,但没有字段或属性?

Joh*_*ski 5 .net c# asp.net-mvc dependency-injection service-locator

通常,使用方法实例化类,但没有字段或属性,有很多开销吗?

我正在开发一个大量使用构造函数注入的ASP.NET MVC应用程序,到目前为止,一些控制器最多有10个依赖项.但是由于依赖性很多,我使用了一个IMyAppServiceProvider接口和类,它通过MVC 3中的DependencyResolver提供对所有依赖项的泛型访问.

我删除了所有特定于应用程序的代码并使用我的基本设置创建了一个Gist(这不包括下面提到的BaseController设置).

我还创建了一个接受的BaseController类IMyAppServiceProvider.所有控制器都继承自此基类.基类获取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>;
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这使得控制器的代码"干净利落".没有私有/受保护的变量,构造函数中没有赋值,服务由基类保护变量引用. 但是,每个请求都将实例化我的应用程序使用的每个服务,无论特定控制器是否使用所有这些服务.

我的服务很简单,只包含一些业务逻辑和数据库交互的方法调用.他们是无国籍人,没有阶级领域或财产.因此,实例化应该很快,但我想知道这是否是最佳实践(我知道这是一个加载的术语).

sll*_*sll 7

每个请求都将实例化我的应用程序使用的每个服务,无论特定控制器是否使用所有这些服务.

我相信你自己已经回答了你的问题,这不是一个好方法.此外,使用这种依赖性解析(Service Locator注入)是一种不好的做法,因为Controller的API变得混乱.控制器客户端不知道特定控制器真正需要哪些服务,因此最终可能会出现意外的运行时错误,单元测试也会变得混乱.

BTW还有一个建议 - 按abstract关键字标记所有被认为是基类的类,这样就可以避免将它用作具体类.设计和实现基类是一个具体的设计决策,因此要明确您的设计意图.

关于实例化的成本,在你的情况下它不会产生很大的不同,但一般来说,为了降低重型对象实例化的成本,你可以:

  • 使用原型模式"避免在标准方式创建一个新对象(例如,使用'新的’关键字)时,它是对于给定应用昂贵的固有成本"(c)中维基百科
  • 对于从所有者对象生命周期开始时不需要的服务使用延迟初始化,因此将根据需要初始化这些服务.由于.NET Framework 4.0可以使用内置的Lazy(T)类