将单例注入scopedService

时间:2018-04-04 22:26:12

标签: c# asp.net singleton

我正致力于将推送通知添加到我的ASP.NET核心2.0.0 webApp中。我想要一个有badgeCount成员的通知服务,当我发出通知或将某些内容标记为已读时,我会更新该成员。

我想让它成为一个单身人士,但似乎我不能对单身人士使用依赖注入。我以后需要访问我的dbContext以及其他一些身份/实体服务。

让我的notifcation服务成为scopedService而不是单例是否合理,以便我可以使用DI?然后有一个notificationBadge单例,我会注入到我的scopedService中,以便我可以维护它吗?

我这样做是因为我不必每次都计算徽章数(包括使用查询)

编辑:实际上,在写完之后我意识到单身人士可能只在服务器启动时实例化一次而不是每个用户。因此,即使我可以使用DI,我的初始方法也不会起作用。我可能不得不在我的用户类上添加一个扩展IdentityUser的字段,然后呢?或者有没有解决方法,以便我不必更新/保存到任何数据库记录?

1 个答案:

答案 0 :(得分:1)

了解DI

因此,为了尝试覆盖您的问题,对于您的应用程序和网站中的大多数内容,DI肯定是您想要的。它可以做单身,以及范围和瞬变(每次都有新的副本)。

为了真正理解DI,特别是.Net Core实现,我实际上在独立的.Net标准开源库中使用来自.Net Core的DI,这样你就可以看到它是如何完成的。

  

视频解释DI并显示我在ASP.Net Core场景之外制作和使用DI:https://www.youtube.com/watch?v=PrCoBaQH_aI

     

源代码:https://github.com/angelsix/dna-framework

如果您从上面的视频中不理解DbContext,则应该回答有关如何访问DbContext的问题:https://www.youtube.com/watch?v=JrmtZeJyLgg

Scoped / Transcient vs Singleton

您必须记住,当谈到是否要使用单一实例是单身总是在内存中,所以你应该总是考虑并努力使事情作用域或transcient以节省内存,如果创造条件,服务不是激烈或缓慢。因此,在某些生成的基础上,它基本上是RAM使用与速度之间的权衡。

如果您具有特定类型的服务,则决策将变为另一种类型。例如,对于DbContext对象,您可以将它们视为"实时,内存数据库查询/代理"就像你想要创建它们的SQL查询一样,执行它们并完成它们。这就是为什么它们是作用域的,所以当创建一个控制器(每个请求)时,一个新的DbContext被创建,注入,被一个动作使用然后被破坏。

我想简单的答案是它通常不会太重要,而且大多数应用程序都没有任何重大问题或问题,但你必须记住单身人士留在内存中的应用程序的生命周期如果您处于罕见的多域设置中,则为应用程序域。

通知计数

所以主要的问题是关于徽章。有参与这一进程并设置许多事情,所以我会限制我的回答对你所谈论的登录到网站上的客户端中的推定和您提供的网站UI,并希望显示的标记计数 for,并且您没有关于某些Android / iOS应用或桌面应用程序。

在生成徽章计数方面,它将是用户在数据库中所有未读消息或项目的组合。我会根据访问页面的用户请求进行此计算(因此在Action中并通过Razer或ViewBag返回到视图中)需要该信息,或者如果您使用响应更快/ Ajax则通过Ajax请求它风格网站。

我再次认为这不是一个问题,我只是为了完整性和推定而说明。

因此,您要问的问题基本上是每次页面更改或重新请求徽章计数时您都担心从数据库获取该信息的时间,对吗?

就个人而言,我不会费心去尝试缓存"这是数据库的外部,因为它是一个快速变化的东西,你可能会试图让缓存保持同步,而不仅仅是调用数据库。

相反,如果你有相关的查询将密集制定的徽章数量,我想不是每一次任何除未读/新项目,或标记为已读项目的数据库做,你做a" SetUnreadCount"调用计算并将该值作为单个整数写入数据库,以便获取未读计数的调用是对数据库的标量调用和SUPER快速调用。