ASP.NET Core 单例服务创建多次

2024-03-28

我正在开发一个 ASP.NET Core 2.1 项目,我需要在 Startup.ConfigureServices 中注册然后使用单例服务。

我有以下代码:

public void ConfigureServices(IServiceCollection services)
{
    //....
    //....

    services.AddSingleton<IMyService,MyService>();

    var serviceProvider = services.BuildServiceProvider();

    var myService = serviceProvider.GetService<IMyService>();

    services.AddDbContext<MyDbContext>(options => options.UseMySql(myService.DBConnectionString));
}

上面的代码对我来说工作得很好,能够在ConfigureServices中使用“MyService”。然而,稍后在我的应用程序中,当我尝试使用 MyService 时,MyService 的构造函数将再次被调用。为什么它不使用自从我使用注册该类以来已经创建的实例AddSingleton?

编辑:我决定编辑以添加我的最终目标,看看是否有不同的方法来完成它。我的单例服务提供对可能来自两个不同位置的一些设置的访问。这些设置之一是数据库连接字符串。我需要在ConfigureServices 中使用该连接字符串,以便在调用时拥有它services.AddDbContext。我还想在获取配置设置的服务中进行一些日志记录,这意味着我还需要获取 ILoggerFactory。


Calling BuildServiceProvider from ConfigureServices将导致创建单例服务的附加副本。

在这种特殊情况下,使用另一种方法来推迟对服务提供商的访问。AddDbContext具有允许这种情况的重载,其中服务提供者作为选项操作委托的一部分提供。

//...

services.AddSingleton<IMyService, MyService>();

services.AddDbContext<MyDbContext>((serviceProvider, options) =>
    options.UseMySql(serviceProvider.GetRequiredService<IMyService>().DBConnectionString)
);

//....

参考AddDbContext<TContext>(IServiceCollection, Action<IServiceProvider,DbContextOptionsBuilder>, ServiceLifetime, ServiceLifetime) https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.entityframeworkservicecollectionextensions.adddbcontext?view=efcore-2.1#Microsoft_Extensions_DependencyInjection_EntityFrameworkServiceCollectionExtensions_AddDbContext__1_Microsoft_Extensions_DependencyInjection_IServiceCollection_System_Action_System_IServiceProvider_Microsoft_EntityFrameworkCore_DbContextOptionsBuilder__Microsoft_Extensions_DependencyInjection_ServiceLifetime_Microsoft_Extensions_DependencyInjection_ServiceLifetime_

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Core 单例服务创建多次 的相关文章

随机推荐

  • 根据内容调整iframe高度

    我正在使用以下脚本自动调整 iframe 高度 function autoIframe frameId try frame document getElementById frameId innerDoc frame contentDocu
  • PHP 中有从数组中提取“列”的函数吗?

    我有一个数组的数组 具有以下结构 array array page gt page1 name gt pagename1 array page gt page2 name gt pagename2 array page gt page3 n
  • 如何在 Raphael 中使用 eve() ?

    有人可以给我一个拉斐尔的简单例子吗eve 我不太明白参数以及如何调用事件 我查了一下 但好像用过的人不多 事件功能的简单示例Rapha l http www raphaeljs com 我们定义将触发事件的函数 function bar v
  • javascript 数组的范围从 IE9 到 FireFox/Chrome 有所不同

    我已经缩小了我的基本问题的范围 从 IE9 到 FireFox 和 Chrome 数组的范围有所不同 在以下函数 仅摘录 中 我声明一个数组 然后通过调用 getJSON 来填充它 因为引用 HoldEm 的行出现在 ProcessArra
  • 查找此 XML 文档中的值的正确 XPath 查询是什么?

    假设我有这个 XML 文档
  • 在 Node.js 中休眠

    假设没有 本地 方法来实现这一点 我的解决方案是 sleep function time var stop new Date getTime while new Date getTime lt stop time return new Pr
  • OleDBConnection 连接字符串

    当我尝试这段代码时OleDBConnection open 不起作用 没有抛出任何错误 只需打开 Windows 窗体并说出任何内容我看到 messageBox try1 但程序没有显示 try2 我的连接字符串有什么问题请帮助我也尝试过
  • 如何在单个 SELECT 查询中设置多个 T-SQL 变量?

    我有3个变量 testid sampleid and clientid 我该如何设置 sampleid and clientid通过执行此查询一次 SELECT sample sampleid client clientid FROM db
  • 现在使用 async/await 安全吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 Javascript 中使用 async await 代替安全吗 现在生成器承诺 知道语法尚未制定并且 会随着 ES8 的发布而出现吗 我可
  • Gnuplot - 使用带有 png 终端的 replot

    我正在尝试在 Gnuplot 中使用带有 png 终端的 replot 如果我执行以下操作 我会在一张图表上绘制两个图 没有任何问题 plot sin x x replot sin x 现在 如果对 png 终端类型执行相同操作 则生成的
  • ignite服务器重新连接后如何恢复缓存

    如果有人能帮助我 我真的很感激 我有一个用Java编写的ignite服务器 还有一个用C 编写的客户端 客户端可以连接到服务器 并且可以正确获取服务器的缓存 服务器重新启动后 客户端会收到来自服务器的 EVT CLIENT NODE REC
  • 如何在 Windows 中使用 Sphinx 创建 PDF 文档

    我正在使用 Sphinx 在 Windows 中为我的 Python 项目创建文档 我需要生成 PDF 文档 我发现了很多关于如何在 Linux 中执行此操作的解释 但没有很好的解释如何在 Windows 中执行此操作 据我了解 我需要使用
  • 如何在MatLab中求曲线上一点的法向量

    我有一条曲线 我想找到该曲线上给定点的法线向量 稍后我必须找到该法线向量与另一个向量的点积 我尝试了MatLab的梯度函数 但我想当我们需要在特定点找到梯度时它不起作用 但我不确定我是否错了 请指导我如何在 MatLab 中实现这一目标 提
  • 创建一个 NSArray,初始化为 N 个对象,所有对象都是同一个对象

    我想创建一个具有相同值的对象的 NSArray 比如 NSNumber 全部初始化为 1 但计数基于另一个变量 除了处理 C 风格数组的初始化器之外 似乎没有一种方法可以使用 NSArray 的任何初始化器来执行此操作 知道是否有一种简短的
  • 从另一个域获取发布的数据时,ASP.NET Webform 丢失会话

    Simply 在网站中 用户登录并创建一些会话对象 网站 A 使用 Response Redirect 将用户重定向到网站 B 中的页面 网站 B 使用提交按钮将表单集合发布到网站 A 上的页面 在此特定点上 该特定用户的所有会话都会丢失
  • 配置文件、证书、应用程序 ID 和密钥之间的关系

    现在我只是想在手机上测试我的应用程序 而不是部署到商店 所有这些事情是如何关联的 由于我不想上传到商店 我可以忽略其中任何一个吗 我参加了大学开发者计划 我能够获得证书并将其安装在 Xcode 中 但构建仍然失败 解决这个问题只是改变应用程
  • 在 python 中使用带有请求的自签名证书

    情况 目标站点 预产品 URL 例如https my pre prod site com login https my pre prod site com login 例如 正在使用自签名证书 从浏览器中 可以通过 https 访问该站点
  • 从 Ruby 列表中获取所有对的组合

    我有一个元素列表 例如数字 我想检索所有可能对的列表 我怎样才能使用 Ruby 做到这一点 Example l1 1 2 3 4 5 Result l2 gt 1 2 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 4 5
  • 有什么方法可以调试我的 .NET 代码通过 dllimport 调用非托管 dll 中的函数后发生的情况吗?

    有什么方法可以调试我的 NET 代码通过 dllimport 调用非托管 dll 中的函数后发生的情况吗 我通过 dllimport 在非托管内部公开了一个 dll 函数 当我在单步执行代码时调用函数时 会发生一些事情并且它永远不会返回 我
  • ASP.NET Core 单例服务创建多次

    我正在开发一个 ASP NET Core 2 1 项目 我需要在 Startup ConfigureServices 中注册然后使用单例服务 我有以下代码 public void ConfigureServices IServiceColl