gpt4 book ai didi

c# - 使用方法但没有字段或属性的类实例化有多快?

转载 作者:太空狗 更新时间:2023-10-29 22:33:43 24 4
gpt4 key购买 nike

一般来说,使用方法但没有字段或属性的类的实例化会产生很大的开销吗?

我正在开发一个大量使用构造函数注入(inject)的 ASP.NET MVC 应用程序,到目前为止,一些 Controller 有多达 10 个依赖项。但是由于大量的依赖项,我求助于 IMyAppServiceProvider 接口(interface)和类,它通过 MVC 3 中的 DependencyResolver 提供对所有依赖项的通用访问。

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

我还创建了一个接受 IMyAppServiceProvider 的 BaseController 类。所有的 Controller 都继承自这个基类。基类采用 IMyAppServiceProvider 对象,并为所有各种服务提供 protected 变量。代码看起来像这样:

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>;
// ...
}
}

这使得 Controller 的代码“非常干净”。没有私有(private)/保护变量,构造函数中没有赋值,服务由基类保护变量引用。 但是,每个请求都会实例化我的应用程序使用的每个服务,无论特定 Controller 是否使用所有这些服务。

我的服务很简单,只包含带有一些业务逻辑和数据库交互的方法调用。它们是无状态的,没有类字段或属性。因此,实例化应该很快,但我想知道这是否是最佳实践(我知道这是一个有内涵的术语)。

最佳答案

every request will instantiate every single service that my application uses, whether or not the specific controller uses all of them.

我相信您自己已经回答了您的问题,这不是一个好方法。此外,使用这种依赖解析(服务定位器注入(inject))是一种不好的做法,因为 Controller 的 API 变得困惑。 Controller 客户端不知道特定 Controller 真正需要哪些服务,因此您最终可能会遇到意外的运行时错误,单元测试也会一团糟。

顺便说一句,还有一个建议——用 abstract 关键字标记所有被认为是基类的类,这样你就可以避免将它用作具体类。设计和实现基类是一个具体的设计决策,因此请明确您的设计意图。

关于实例化的成本,在你的情况下它不会有太大的不同,但一般来说,为了减少重对象实例化的成本,你可以:

  • 使用Prototype pattern “避免以标准方式(例如,使用‘new’关键字)创建新对象的固有成本,因为对于给定的应用程序来说成本过高” (c) Wikipedia
  • 使用Lazy Initialization对于从所有者对象生命周期开始就不需要的服务,因此这些服务将按需初始化。自 .NET Framework 4.0 以来,您可以使用内置的 Lazy(T) class

关于c# - 使用方法但没有字段或属性的类实例化有多快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9691451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com