0
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 中放置了一个断点,如果它被调用应该会触发,所以我倾向于说“不,它没有被调用”......但我不确定我的断点实际上是正确的done 或 'hitting' (我只是在 IIS 中设置了这个服务,我之前没有理由调试它),所以我想从更熟悉的人那里知道,“它应该被调用吗?” 以及为什么,或者为什么不。因为我可以从这段代码中看出,编写它的人肯定希望它会被调用。

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

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

4

1 回答 1

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

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

因此,对于某些人来说,将服务调用缓存到变量_client中只有在以下情况下才有用:a)服务的初始化很昂贵,b)如果Client单个实例上的属性AreaModel将在同一个请求中被多次访问。

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

于 2013-08-24T16:09:54.000 回答