You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

依赖注入注册的单例实例能否在不同类或控制器中复用?

问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:17:38