【问题标题】:why should I use dependency injection in my .net core project architecture?为什么我应该在我的 .net 核心项目架构中使用依赖注入?
【发布时间】:2020-07-28 14:12:43
【问题描述】:

想详细了解.net Core的DI容器。如果假设我们有一百个类和各自的接口,并且我已经在我的 startup.cs 文件中注册了所有依赖项。 那么我的问题是哪一个是真的? a) 所有一百个实例都会创建启动时间,因为我已经在 startup.cs 中提到了所有依赖项。 b) 只有那些在构造函数中定义的实例才会在运行时创建。

【问题讨论】:

    标签: asp.net-core dependency-injection asp.net-core-mvc solid-principles


    【解决方案1】:

    这在一定程度上取决于生命周期,但通常情况下,它们会根据需要进行实例化。例如,如果您将某些东西注入控制器,那么当该控制器被激活时,它所具有的依赖项(在构造函数中定义)被实例化,并且这些依赖项所具有的任何依赖项都被实例化,等等。例外情况是带有单例的东西寿命。它会在第一次需要时被实例化,然后显然会一遍又一遍地重复使用。

    长和短,不,不是所有 100 个服务都在应用启动时实例化,除非所有 100 个服务在应用启动期间以某种方式使用(导致它们需要被实例化)。

    【讨论】:

    • 非常感谢您的回答。这意味着如果我使用瞬态生命周期,则选项 b) 为真。
    • 具有瞬态生命周期的对象在每次注入时总是实例化,并在代码超出范围时立即处理。
    • 还有一个问题,如果我在我的新项目架构中使用 DI,项目对于新开发人员来说会变得很复杂,比如创建接口、类并将它们映射到 startup.cs 文件中。根据相同的观点,您的观点是什么?
    • 并不复杂;这是很好的应用程序设计。大多数情况下,DI 作为一个术语使用不正确。注入部分是顶层应用的函数;它如何满足依赖关系。真正重要的是控制反转:注入功能,而不是在类中定义。
    【解决方案2】:

    基本上,您需要将其想象为在您的 startup.cs 文件中注册的服务列表,并将在执行应用程序时相应地使用这些服务。

    为此,您可以通过构造函数注入来注入它们,例如(也是我认为最常用的一种)。这就是说,我们现在可以谈论与它们相关的生命周期。我将简洁地表达它们:

    AddSingleton:对于您发出的每个 HTTP 请求,将始终使用同一个实例,换句话说:始终从容器中注入同一个实例。

    AddScoped:每个 HTTP 请求都会实例化一个新服务,但仅在应用程序的“不同位置”的该请求范围内使用。

    AddTransient:对于每个 HTTP 请求,将使用不同的实例,并在应用程序的“不同位置”注入不同的实例。

    至于您的标题问题,依赖注入是一种简化依赖项实例化的方法,因为它将是框架本身在做“肮脏的工作”。

    【讨论】:

    • 感谢您对这三种方法的回复和解释,在我必须构建rest API(如登录,注册,获取用户列表/简单获取和发布API)的情况下,哪种方法适合给我们?
    • 这真的取决于你的实现和具体情况。我推荐阅读这个post,我相信你会在这里找到答案:)
    • 读完这篇文章后,transient 在我的例子中很有用,因为每个 API 都有自己的上下文实例,也可以并行运行。这意味着瞬态最适合无状态服务
    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    相关资源
    最近更新 更多