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

时间:2013-08-24 14:57:46

标签: c# asp.net-mvc asp.net-mvc-4 caching model

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()第二次被召唤?)。所以,如果有人熟悉的话,我的第二个问题是,如果它完全正常工作,缓存这样的东西是否有意义?当模型在每个页面加载时重新创建时,为什么最好在模型创建时预先填充“区域”,而不是仅在视图/控制器中访问它并将其存储在范围内的某个变量中的页面?对我来说,似乎他们会花费相同的时间。

我希望这个问题得到很好的解释并且有道理。如果有任何方法我可以编辑问题以便更有利于每个人,请告诉我。

1 个答案:

答案 0 :(得分:1)

    调用Client.GetAreaHeaders()构造函数时,将调用
  1. AreaModel。它将被调用,因为访问了Client属性并且Client的getter具有此语句,var c = Areas;此语句访问将调用{Areas的{​​{1}}属性1}}。话虽如此,语句Client.GetAreaHeaders()是不必要的,因为它创建了从未使用过的本地变量var c = Client;。他可能已经这样做了,以初始化c属性,虽然这是一种非传统的方式,它应该只在构造函数本身初始化。

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

  3. 所以对某些人来说,将服务调用缓存到变量c只会在以下情况下有用:a)服务的初始化是昂贵的,而b)如果单个_client属性Client的实例将在同一请求中多次访问。

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