c# - 应该首选哪个依赖注入(inject)生命周期?

标签 c# rest api asp.net-core

对于 REST api,它在请求之间没有依赖关系并且正在使用 ASP.NET Core DI。

在选择最合适的选项时,我听到了相互矛盾的论点:

  • 由于内存和多线程问题,更喜欢 transient 然后限定范围并避免单例,还因为由于强制依赖,单例不应该与其他生命周期一起注入(inject)
  • 首选单例以节省实例化对象的时间并防止打开多个连接

  • 我知道它们的工作方式不同,但是有一个“首选”的生命周期吗?它应该以“ transient ”开始并根据需要转移到其他人吗?

    是否有任何调查证明单例节省的实例化时间实际上是相关的?

    最佳答案

    我不会说这里有正确或错误的方式,但我会分享我的个人经验。

    我已经尝试了两种方法,最终发现最好从 transient 开始,然后根据需要扩大范围。

    根据单一职责原则和变更原因进行思考。您的服务生命周期范围可能需要更改的原因可能与您对服务实现本身所做的更改有关。当那个原因发生时,你只想改变一个类。

    如果您的服务需要比大多数其他服务更长寿,那么您所要做的就是使其生命周期更长,并为任何生命周期较短的依赖项注入(inject)工厂。

    另一方面,如果你有一个类需要比大多数其他服务更短生命周期,那么你最终将不得不将它作为工厂注入(inject)到所有生命周期更长的服务中。因此,更改的一个原因会影响整个代码库中的代码。

    当然,这是假设您正确地做事:避免强制依赖并记住使非线程安全服务 transient 。我发现记住哪些服务需要长期存在并覆盖该方向的默认值要比记住哪些服务不应该长期存在并以这种方式覆盖默认值要容易得多。而且我发现不做后者会导致更隐蔽的错误,这些错误更难以注意到并导致更大的损害。

    关于性能:我没有使用 ASP.NET Core 内置 DI 框架进行性能测试,但我发现 SimpleInjector 足够快,相比之下创建新服务实例的时间和内存开销微不足道与我的应用程序所做的其他工作(如查询数据库)。

    关于防止打开多个连接:SQL Server connections are pooled automatically所以创建 new SqlConnection() 的成本并在请求中多次处理它通常是微不足道的。

    关于c# - 应该首选哪个依赖注入(inject)生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60568631/

    相关文章:

    c# - 在 404/500/任何异常上显示 MVC5 中的自定义错误 CSHTML 页面?

    rest - SPA - 基于服务器端验证的操作确认

    arrays - POST对象数组到REST API

    c# - 不支持流读取器异常 URI 格式

    c# - 在 WPF 中显示 Drawing.Image

    rest - 是否可以在内部(私有(private))IIS 服务器上运行 Golang REST Web 应用程序?

    javascript - 通过 Javascript 与 RESTful API 交互?

    api - 为什么YouTube供稿上的数据与真实数据不同?

    android - 安全 API 访问 : best strategy to secure readonly rails api for android client

    c# - 使用 StackExchange.Redis 从 Redis 获取多个哈希值