这些变量是否在创建时解析?(MVC 模型中的缓存)

本文关键字:模型 MVC 缓存 是否 变量 创建 | 更新日期: 2023-09-27 18:28:57

public AreaModel(Int64 AreaId)
{
    CurrentAreaId = AreaId;
    CurrentSet = true;
    var c = Client;
}
private ManagementServiceClient Client
{
    get
    {
        if (_client == null || _client.State == (CommunicationState.Closed | CommunicationState.Faulted))
        {
            _client = new ManagementServiceClient();
            _client.Open();
        }
        var c = Areas;
        return _client;
    }
}
public Management_Area[] Areas
{
    get
    {
        return Client.GetAreaHeaders();
    }
}

此代码是传递到 MVC 视图的自定义模型的执行。

我们有一个开发人员在我们公司写了很多奇怪的(对我们来说(代码,然后突然离开了。他的很多代码都是以如此特定的方式编写的,以至于我们很难知道他是否真的知道他在做什么,或者根本不知道。

我问这个问题的原因是因为我看到他在这里做什么,但我不确定它是否有效,或者它的真正意义是什么。

我的第一个问题是:当调用AreaModel的构造函数时,Client.GetAreaHeaders((会被调用吗?因为我明白为什么会这样,但我并不完全相信它真的会这样。我在服务端的 GetAreaHeaders 中放置了一个断点,如果它被调用,它应该会触发,所以我倾向于说"不,它不会被调用"......但我不确定我的断点是否真的正确完成或"命中"(我只是在 IIS 中设置了这个服务,我之前没有理由调试它(,所以我想从更熟悉的人那里知道,"它应该被调用吗?"以及为什么,或者为什么不。因为我可以从这段代码中看出,编写它的人肯定期望它会被调用。

在我看来,他

正在考虑实现服务调用结果的某种缓存的想法,但从未真正将其保存在任何有用的地方(因为当他尝试读取它时,GetAreaHeaders(( 不会只是第二次被调用吗?因此,如果有人熟悉,我的第二个问题是,如果它完全正常工作,缓存这样的东西是否有意义?当模型在每次页面加载时重新创建时,为什么最好在创建模型时预先填充"区域",而不是只在视图/控制器中访问它一次并将其存储在页面范围内的某个变量中?对我来说,他们似乎需要相同的时间。

我希望这个问题得到很好的解释和理解。请让我知道是否有任何方法可以编辑问题以对每个人都更有益。

这些变量是否在创建时解析?(MVC 模型中的缓存)

  1. 当调用AreaModel构造函数时,将调用Client.GetAreaHeaders()。 之所以调用它,是因为访问了 Client 属性并且Client的 getter 具有此语句,var c = Areas;此语句访问将调用 Client.GetAreaHeaders()Areas 属性。 话虽如此,语句var c = Client;是不必要的,因为它创建了从未使用的局部变量c。 他这样做可能是为了初始化 Client 属性,尽管这是一种非常规的方法,但它应该只是在构造函数本身中初始化。

  2. 只要有合理的工作量被执行,缓存就有意义,因此缓存结果将改善第二次访问的响应时间。 话虽如此,与每个缓存一样,它可能会变脏,这可能是需要考虑的,也可能不是需要考虑的。 此缓存是否有帮助取决于使用此模型的确切控制器/操作逻辑和视图逻辑。 我想说的是,在大多数情况下你是对的,这可能是不必要的,因为它是一个 Web 应用程序,每个请求都会创建和销毁所有内容,除非您将数据存储在更永久的地方,例如会话或数据库。 此外,语句 var c = Areas; 甚至比构造函数中的类似调用更无用,因为 Areas getter 不存储任何内容,并且局部变量 c 再次从未使用过。

因此,对于

某些人来说,将服务调用缓存到变量_client中仅在以下情况下有用:a( 服务的初始化成本很高,并且 b( 如果单个 AreaModel 实例上的 Client 属性将在同一请求中多次访问。

再次查看代码似乎会导致无限循环,因为 Client 属性访问 Areas 属性,然后再次访问 Client 属性。