如何创建一个没有构造函数参数的具有依赖注入的类

can*_*stu 3 c# asp.net dependency-injection parameter-passing asp.net-core

我已将依赖注入添加到项目中。但是当我使用new关键字创建实例时,依赖注入不起作用。

public class MyClass
{
    ILoginTokenKeyApi _loginTokenKeyApi;

    public MyClass(ILoginTokenKeyApi loginTokenKeyApi)
    {
        _loginTokenKeyApi = loginTokenKeyApi;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

当我尝试创建 MyClass 的实例时,它希望自然构造一个参数。

像这样 :

MyClass mc = new MyClass(); // ERROR, it wants a parameter (but it is what i want)
Run Code Online (Sandbox Code Playgroud)

我要做 :

MyClass mc = new MyClass(new LoginTokenKeyClass()); // this is not a good code for me
Run Code Online (Sandbox Code Playgroud)

我如何创建没有参数的 MyClass 实例,因为它注入了依赖项。

pok*_*oke 8

但是当我使用new关键字创建一个实例时,依赖注入不起作用。

这就是依赖注入的基本工作原理。

使用依赖注入,您根本不应该创建new新对象。这就是依赖注入控制反转的全部意义所在。相反,创建对象并管理这些对象的依赖,你是取决于框架,你的依赖关系,你需要,而无需你关心他们究竟来自哪里,以及如何他们的构筑。因此,您正在将创建对象的责任转移给调用者。

如果您发现自己需要创建一个具有依赖项的对象,那么这清楚地表明您做错了。一个常见的原因是你想要创建对象来管理它的生命周期,或者因为它实际上是一个数据对象,恰好有一些需要其他依赖项才能工作的操作(例如一个具有“保存“ 方法)。在第一种情况下,您根本不会那样做。你只需要依赖它,让框架管理生命周期;如果它的生命周期不正确,那么您应该使用 DI 容器重新配置它。

在后一种情况下,您有一个带有操作的数据对象,您应该将其拆分。您应该只有一个数据对象,没有任何逻辑,然后注入一些能够为您对该数据对象执行操作的管理器服务。

例如,在 ASP.NET Core Identity 中,您拥有的User对象只是一个没有任何逻辑的普通实体。例如,为了添加用户角色或更改密码,您依赖于您可以注入的用户管理器。所以User对象本身没有任何依赖。

我通常建议您阅读ASP.NET Core 文档的依赖注入章节,以了解依赖注入是如何工作的以及它应该如何在框架中使用。

  • “使用依赖注入,您根本不应该新建新对象。”。我明白你在这里想说什么,但这并不完全准确。“新”依赖项完全_好_,只要您在应用程序的启动路径中执行此操作,也就是 [Composition Root](https://freecontent.manning.com/dependency-injection-in- net-2nd-edition-understanding-the-composition-root/)。DI 不需要使用 DI Container,这种做法通常被称为 [Pure DI](http://blog.ploeh.dk/2014/06/10/pure-di//)。除此之外,我同意你的看法。 (4认同)

小智 0

有两种类型的依赖注入。

  1. 构造函数注入 - 你不想要的
  2. 属性注入 - 在此 - 您公开要注入的对象的 Public Get/Set 属性。然后在你的 DI 配置文件(如 spring.net)中你可以分配值。

执行 DepInjection 的另一种方法是在无参数构造函数中 - 您可以通过键/名称获取对象。就像在 Spring.Net 中一样,我们会这样做:

var UtilityObject = Spring.ContextRegistry.GetContext().GetObject("MyUtilObject") as TheUtilityClass;
Run Code Online (Sandbox Code Playgroud)