如何在 MVC .NET C# 应用程序外部和内部使用 C# 对象

How to have a C# object available outside and inside an MVC .NET C# application

我有一个 MVC .NET C# 应用程序,我需要一个对象的实例在 MVC 应用程序的整个范围内以及它之外都可用。

该对象是我创建的自定义 C# class 的一个实例。

必须是这个对象的同一个实例,不能在MVC应用程序之外实例化另一个实例。

因此对象必须在此范围内可用(这是我对 "outside the MVC app framework)" 的定义:

    var host = WebHost.CreateDefaultBuilder()
                          .UseKestrel()
                          .UseUrls("http://*:80")
                          .UseStartup<Api.Hosting.Startup>()
                          .UseHttpSys()
                          .Build();
    host.RunAsync();

通过实例化它很容易做到:

    var obj = new MyClass();

    // here make use of the obj instance
    obj.DoSomething();

    var host = WebHost.CreateDefaultBuilder()
                          .UseKestrel()
                          .UseUrls("http://*:80")
                          .UseStartup<Api.Hosting.Startup>()
                          .UseHttpSys()
                          .Build();
    host.RunAsync();

但现在我如何在 MVC 应用程序中使用相同的对象(我的意思是,在控制器级别、服务级别等等...)

这是使用依赖注入的一个很好的用例。 .NET Core 将 DI 视为框架中的第一个 class 公民 (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection),并且它具有相当高的可配置性,使您有机会精细控制对象的生命周期。在您的 ConfigureServices 方法中,您将添加以下代码以使您在代码示例中创建的对象的单个实例可供 MVC 应用程序使用: services.AddSingleton<MyClass>(obj);

在 MVC 应用程序中,您最好在控制器上使用构造函数注入来提供 Singleton 实例,但如果当前实现有一些限制,则可以通过 HttpRequest.RequestServices 对象 - 本质上将其用作服务定位器。再次 - 你最好在这里使用构造函数注入并且不要对 HttpRequest 产生不必要的依赖。