当前位置: 首页 > 知识库问答 >
问题:

构造函数参数为单例的外部类的依赖注入

华涵意
2023-03-14

我对。NET核心中的依赖注入是新手。 到目前为止,我使用的是interface,并且能够很容易地通过DI框架注入依赖项。

现在,我有了一个外部库,它保存mongo DB连接并提供必要的数据库操作调用。

该类接受两个参数,即连接字符串和数据库名称。 由于MOQ可以在没有接口的情况下注入依赖项,所以我尝试添加下面的代码

services.AddSingleton<MongoManager>();

由于Mongomanager类接受连接字符串,因此这将不起作用。 之后尝试下面的代码。

services.AddSingleton(new MongoManager(userName, database));

上面的代码按预期工作,但它在应用程序启动时创建对象。 在其他情况下,。NET framework在第一次请求时给出类的实例,但是在这里,它被创建而不被任何地方的应用程序询问。 当应用程序终止时,该对象是否会被释放? 有没有任何方法注册类,并告诉框架传递某些参数,如连接字符串,数据库名称等,当实例第一次请求时,类。

共有2个答案

蒲寂离
2023-03-14

您可以使用services.addTransientservice.addScoped控制作用域。

所有这些都将在应用程序终止时处理。

对不起,我误解了你的问题,你可以像这样把参数传递给方法。

services.AddSingleton(x => new MongoManager(param1, param2));

单例生存期服务(AddSingleton)是在第一次请求它们时(或者在运行Startup.ConfigureReservices并使用服务注册指定实例时)创建的。

在处理请求的应用程序中,当在应用程序关闭时处理ServiceProvider时,就会处理单例服务。

引用:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1#singleton

漆雕安晏
2023-03-14

存在一个接受func 的重载,该重载仅在首次需要时实例化单例:

services.AddSingleton(_ => new MongoManager(userName, database));
 类似资料:
  • 我需要重构现有的抽象类来实现依赖注入,但是这个类有两个接受其他参数的构造函数。 我需要注入一些接口,并避免在构造函数中传递任何其他参数,如“settingsId”和“Setting”。所以我的想法是在创建此类的实例后创建两种方法来设置这些参数。 但它看起来不是一个合适的解决方案,因为如果开发人员忘记在创建实例后运行这些方法之一,我们将来可能会得到一个异常(对象未设置为引用...)。我应该如何正确执

  • 我有一个自定义类,它有一个参数化构造函数 因此,实例化时需要3个参数。如果我想将这个类作为依赖项添加,我发现在Spring中没有直接的方法可以做到这一点。 我知道我可以简单地创建一个类的新实例并使用它的方法。但是我找不到任何直接的方法将这个类注入我的另一个类,即Rest控制器。 需要注意的是:所有3个参数都需要在运行时传递。我不能从属性文件中使用它们 即使Spring中没有直接的方法,我也想知道定

  • 在之前的所有JUnit版本中,测试构造函数或方法都不允许有参数(至少不能使用标准的Runner实现)。作为JUnit Jupiter的主要变化之一,测试构造函数和方法现在都允许有参数。这带来了更大的灵活性,并为构造函数和方法启用依赖注入。 ParameterResolver定义了测试扩展的API,希望在运行时动态解析参数。如果测试构造函数或@Test, @TestFactory, @BeforeE

  • 和另一个类: 在这种情况下,服务将按照预期注入到A类中。据我所知,你不能在a类中使用构造函数,否则注入将无法工作。有没有一种方法可以在a类中使用一个构造函数,同时注入服务?即: 在这种情况下,我得到的服务是空的,无论如何要解决这个问题?我希望能够从类型A中使用“new”创建一个对象,并注入服务,这可能吗?

  • 我有一个通用服务,它使用一个配置来进行它的处理。 我想在我的控制器的操作中注入那个服务。但每个操作都有特定的配置。 我如何使用? 有没有配置控制器操作的方法? 比如这样: 我可以在MyCustomService中使用一个config方法,并在每个控制器的操作中调用它。但没那么优雅。

  • 问题内容: 我已经用策略模式实现了一个程序。所以我有一个在某些地方使用的接口,并且可以替换具体的实现。 现在我要测试该程序。我想以类似的方式做。编写一次测试,针对该接口进行测试。应在测试开始时注入具体的接口实现,以便我可以轻松地替换它。 我的测试类看起来与此类似: 在开始测试时,必须使用参数化的构造器来注入具体的策略实施。 现在我没有让TestNG运行它并注入具体的实现实例。我试图与继承几种方法,

  • 当容器调用具有许多参数的类构造函数时,完成基于构造函数的DI,每个参数表示对另一个类的依赖。 例子 (Example) 以下示例显示了一个类TextEditor ,它只能通过构造函数注入进行依赖注入。 让我们有一个可用的Eclipse IDE,并按照以下步骤创建一个Spring应用程序 - 脚步 描述 1 创建一个名为SpringExample的项目,并在创建的项目中的src文件夹下创建一个包co

  • 我刚刚了解了依赖注入(DI),我开始喜欢它了。为了注入依赖关系,我使用了GoogleGuice框架。一切在概念上运行良好,但在编写模块时,我想到了一个想法:如果我的模块需要依赖项作为构造函数,那该怎么办?毕竟,它只是一个扩展抽象模块的类。所以,基本上,我有三个模块作为一个整体。 > 环境模块 服务模块 < li >第三个模块(它不接受任何构造函数中的任何参数,并且有自己的一些绑定) 基本上,服务模