【问题标题】:MVC Page Load instantiate several controllers with shared resourcesMVC 页面加载实例化多个具有共享资源的控制器
【发布时间】:2019-06-01 22:03:50
【问题描述】:

我检测到,在加载主页期间,会实例化几个控制器(我认为是因为主页是由几个部分构建的)。控制器实例化 API 类以通过它们查询一些数据。我想知道如何以及在哪里可以在它们之间共享相同的 API 类实例。

我可以想象这样的代码:

class HomeController : Controller
{
   private MyApi Api;
   public HomeController()
   {
     this.Api = get the pervious MyApi instance form somewhere
     if (this.Api == null) // 1st time
     {
         this.Api = new MyApi();
         put this instance to somewhere to share between controllers
     }

这个“某处”不是会话,因为下一页加载需要另一个 MyApi 实例。它必须转到在整个页面加载过程中保持不变的对象属性,但在生成 html 结果时将其关闭。这一定很简单,但我真的不知道它在哪里:(有人可以帮我吗?

【问题讨论】:

    标签: c# model-view-controller controller


    【解决方案1】:

    您可以考虑在您的应用程序中使用 Microsoft Unity Framework

    使用 Unity Dependency Injector,您将能够将 MyApi 类的实例注入任何控制器,避免编写“if (this.Api == null)”这些类型的检查以及在某些会话或应用程序中管理它的实例级别变量,这会使代码变脏。

    对于这个特定的问题“它必须转到一个在整个页面加载过程中保持不变的对象属性,但在生成html结果时被关闭”,您可以将Unity Injected对象配置为具有“作用域”。意思是,每个请求都会创建一次对象。

    这是在 asp.net 核心应用程序中配置 Unity 的链接 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2

    【讨论】:

    • 谢谢。问题是 @Html.Action(...) 调用产生不同的“范围”。我认为几乎不可能检测到哪些控制器操作可以“分组”在一起(同一用户同一页面),并在它们之间共享资源。我认为这些操作在同一个线程上运行 - 但事实并非如此。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多