依赖注入注册的单例实例能否在不同类或控制器中复用?
问题:ASP.NET Core中Singleton服务是否能在多个类/控制器中共享同一个实例?
我定义了如下接口:
public interface Irepos { string somefunction(); }
随后实现该接口的类:
public class repos : Irepos { string somefunction() { return "function called"; } }
我在startup.cs中将其注册为单例服务:
services.AddSingleton<Irepos, repos>();
目前我可以在控制器类中这样使用该实例:
public class ValuesController { private readonly Irepos interfaceRepos; public ValuesController(Irepos reposInterface) { interfaceRepos = reposInterface; } // 示例:在Action方法中调用 public IActionResult SomeAction() { interfaceRepos.somefunction(); return Ok(); } }
现咨询:是否可以在另一个类或另一个控制器中使用同一个repos类的实例?例如以下代码场景:
public class AnotherController { private readonly Irepos interfaceRepos; public AnotherController(Irepos reposInterface) { interfaceRepos = reposInterface; } // 示例:在Action方法中调用 public IActionResult AnotherAction() { interfaceRepos.somefunction(); return Ok(); } }
回答
当然可以!这正是Singleton服务的核心设计目的——整个应用的生命周期内只会创建一个实例,所有通过依赖注入获取该服务的类(不管是控制器、普通业务类还是其他服务),拿到的都是同一个repos对象。
背后的原理
当你用services.AddSingleton<Irepos, repos>()注册服务时,ASP.NET Core的DI容器会在第一次请求这个服务时创建repos的实例,之后任何地方请求Irepos,容器都会直接返回这个已创建好的实例,不会再新建。
你的代码小修正
这里要提个细节:你最初的示例代码里,直接在控制器类的顶级作用域调用interfaceRepos.somefunction()是不合法的,必须把调用放在类的方法内部(比如控制器的Action方法),就像我上面调整后的代码那样,这是C#的语法要求哦。
扩展:普通类也能共享实例
不止控制器,普通业务类也可以通过构造函数注入拿到这个单例实例,比如:
public class OrderService { private readonly Irepos _repo; // 构造函数注入Irepos实例 public OrderService(Irepos repo) { _repo = repo; } public void ProcessOrder() { // 这里调用的和控制器里的是同一个实例 var result = _repo.somefunction(); } }
只要这个OrderService也是通过DI容器创建的(比如把它注册为服务,或者在控制器中通过构造函数注入它),它拿到的Irepos就和所有地方的实例完全一致。
总结一下:你完全可以放心在多个控制器、多个类中共享这个repos单例实例,DI容器会帮你妥妥管理好实例的复用。
内容的提问来源于stack exchange,提问作者thou_mayest
相关产品推荐
相关产品推荐

