如何在MVC .NET C#应用内外共享同一自定义类实例
解决方案:共享预实例化对象到MVC应用内部
这个场景我太熟悉了——提前初始化好对象,想让整个MVC应用内部都复用同一个实例对吧?其实核心就是把你预先创建的实例注册到ASP.NET Core的依赖注入(DI)容器里,这样不管是控制器、服务还是其他地方,都能拿到同一个对象。
具体步骤:
预实例化对象并完成初始化
你已经在WebHost外部创建了MyClass实例,这一步保持不变:var obj = new MyClass(); obj.DoSomething(); // 先完成你需要的初始化操作将实例注册为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,请移除那部分代码,避免重复注册覆盖掉这个预实例化的对象。在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
相关产品推荐
相关产品推荐

