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

如何在MVC .NET C#应用内外共享同一自定义类实例

解决方案:共享预实例化对象到MVC应用内部

这个场景我太熟悉了——提前初始化好对象,想让整个MVC应用内部都复用同一个实例对吧?其实核心就是把你预先创建的实例注册到ASP.NET Core的依赖注入(DI)容器里,这样不管是控制器、服务还是其他地方,都能拿到同一个对象。

具体步骤:

  1. 预实例化对象并完成初始化
    你已经在WebHost外部创建了MyClass实例,这一步保持不变:

    var obj = new MyClass(); 
    obj.DoSomething(); // 先完成你需要的初始化操作
    
  2. 将实例注册为DI容器的单例服务
    在构建WebHost的链式调用中,添加ConfigureServices方法,把已有的obj注册为单例。这样DI容器会把这个实例作为MyClass类型的唯一实例,整个应用范围内复用:

    var host = WebHost.CreateDefaultBuilder() 
        .UseKestrel() 
        .UseUrls("http://*:80") 
        // 关键:注册预创建的实例为单例
        .ConfigureServices(services =>
        {
            services.AddSingleton<MyClass>(obj);
        })
        .UseStartup<Api.Hosting.Startup>() 
        .UseHttpSys() 
        .Build(); 
    host.RunAsync();
    

    注意:如果你的Startup.ConfigureServices里已经注册过MyClass,请移除那部分代码,避免重复注册覆盖掉这个预实例化的对象。

  3. 在MVC内部通过依赖注入使用实例
    不管是控制器还是服务,只需要通过构造函数注入MyClass类型,就能拿到你预先创建的同一个实例:

    控制器中使用:

    public class HomeController : Controller
    {
        private readonly MyClass _sharedInstance;
    
        // 构造函数注入
        public HomeController(MyClass sharedInstance)
        {
            _sharedInstance = sharedInstance;
        }
    
        public IActionResult Index()
        {
            // 使用同一个实例执行操作
            _sharedInstance.DoAnotherThing();
            return View();
        }
    }
    

    自定义服务中使用:

    public class MyBusinessService : IMyBusinessService
    {
        private readonly MyClass _sharedInstance;
    
        public MyBusinessService(MyClass sharedInstance)
        {
            _sharedInstance = sharedInstance;
        }
    
        public void ProcessData()
        {
            _sharedInstance.DoSomething();
        }
    }
    

    甚至在Startup.Configure方法里也能直接注入使用:

    public void Configure(IApplicationBuilder app, MyClass sharedInstance)
    {
        // 这里的sharedInstance就是你预创建的那个实例
        sharedInstance.DoStartupSetup();
        // ...其他中间件配置
    }
    

为什么这样可行?

ASP.NET Core的DI容器中,AddSingleton<TInstance>(instance)会将你提供的对象作为容器中该类型的唯一实例。任何后续请求该类型的地方,DI容器都会返回这个预先创建好的对象,完美实现了跨WebHost外部和MVC应用内部的实例共享。

内容的提问来源于stack exchange,提问作者Gianluca Ghettini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:41:52