Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心API服务生命周期_C#_Asp.net Core_Dependency Injection - Fatal编程技术网

C# ASP.NET核心API服务生命周期

C# ASP.NET核心API服务生命周期,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,我的ASP.NET Core(2.1)应用程序中有一项服务需要是单例的,因为我需要在应用程序的整个生命周期中将信息保存在内存中。此服务对某些不需要是单例的存储库具有依赖关系,我想将它们定义为瞬态,但ASP.NET Core不喜欢将瞬态依赖关系注入单例服务。我能理解为什么,尽管我对这东西还是新手。但我的问题是:处理这种情况的正确方法是什么?我可以将我的存储库设置为单例,这将满足ASP.NET核心的要求。或者,我可以尝试使用服务提供商在需要时获取存储库。但我正在寻找一种“最佳实践”方法。如有任何建议

我的ASP.NET Core(2.1)应用程序中有一项服务需要是单例的,因为我需要在应用程序的整个生命周期中将信息保存在内存中。此服务对某些不需要是单例的存储库具有依赖关系,我想将它们定义为瞬态,但ASP.NET Core不喜欢将瞬态依赖关系注入单例服务。我能理解为什么,尽管我对这东西还是新手。但我的问题是:处理这种情况的正确方法是什么?我可以将我的存储库设置为单例,这将满足ASP.NET核心的要求。或者,我可以尝试使用服务提供商在需要时获取存储库。但我正在寻找一种“最佳实践”方法。如有任何建议,将不胜感激


谢谢

正如@CamiloTerevinto在评论中指出的那样,如果不知道更多关于你实际在做什么,就很难给你精确的指导。不过,我可以告诉你一些一般的事情

首先,单例有两种形式:过于简单的多个副本没有意义,或者过于复杂的多个副本会让人感到负担。介于两者之间的频谱上的任何东西都可能是请求范围内的或暂时的。重要的是,将数据保存在内存中并不是使用单例作用域的有效理由。您可以从具有任何生存期的对象使用内存缓存(甚至更好:分布式缓存)。在对象上需要长寿命状态几乎总是坏类设计的信号

第二,讽刺的是,如果有的话,您的存储库实际上应该是具有单例作用域的存储库。存储库通常需要数据库连接,并且应该尽可能长或实用


然而,不要只是继续把你的存储库变成一个单件,然后就到此为止。您应该首先停止并评估当前的单例类是否真的应该在该范围内。然后,根据您的应用程序的不同,实际上最好将repos请求的作用域限定,这仍然意味着您不能直接注入它们。

根据定义,单例总是实例化一次。您认为如何注入瞬态构造函数参数?临时服务
“每次被请求时都会被创建”
使用单例,它们只会被请求一次。您可以添加一些关于该服务的信息吗?因此,我们可以建议一种更合适的方法“ASP.NET Core不喜欢在向单例服务中注入临时依赖项”。为什么呢?据我所知,ASP.NET内核完全可以使用这种方法吗?你有什么例外吗?如果是这样,请发布异常详细信息。只是一个小注释:repo实际上应该依赖于某个dbcontext(它拥有db连接),这意味着dbcontext应该是单例的,而存储库本身可以是瞬态的(可能是瞬态的,因为它们是无状态的)。否。存储库不应该依赖于
DbContext
,因为在这种情况下,您甚至不应该使用存储库。存储库模式的唯一有效使用是在处理低级数据访问(如直接SQL查询)时。一个类似ORM的实体框架就是您的数据层。嗯,这很难想象。现实世界的例子:您有ddd项目和cosmosdb,在其中存储数据。你不使用任何orm。您有存储库(定义为域中的接口)。cosmosdb客户端连接应为单例。如果不将dbClient注入到存储库实现中,您将如何做到这一点?此应用程序是一个“服务器”应用程序,通过对各种内部机器进行web调用来获取数据,因此在这种情况下使用dbcontext不是问题。我明白你说的使用缓存的意思了。我认为,目前,将数据保存在内存中是使服务成为单例服务的唯一原因。我会再看一眼,看看是否可以使用缓存。谢谢@deezg db客户端就是您的“连接”。在这种情况下,您只需使用cosmosdb客户端而不是ADO.NET的SqlClient。同样的差别,那很好。但是,如果您有ORM。ORM是您的数据层。将其包装在另一个存储库层中完全没有意义,实际上只会增加应用程序的熵。