这些变量是否在创建时解析?(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(( 不会只是第二次被调用吗?因此,如果有人熟悉,我的第二个问题是,如果它完全正常工作,缓存这样的东西是否有意义?当模型在每次页面加载时重新创建时,为什么最好在创建模型时预先填充"区域",而不是只在视图/控制器中访问它一次并将其存储在页面范围内的某个变量中?对我来说,他们似乎需要相同的时间。
我希望这个问题得到很好的解释和理解。请让我知道是否有任何方法可以编辑问题以对每个人都更有益。
-
当调用
AreaModel
构造函数时,将调用Client.GetAreaHeaders()
。 之所以调用它,是因为访问了Client
属性并且Client
的 getter 具有此语句,var c = Areas;
此语句访问将调用Client.GetAreaHeaders()
的Areas
属性。 话虽如此,语句var c = Client;
是不必要的,因为它创建了从未使用的局部变量c
。 他这样做可能是为了初始化Client
属性,尽管这是一种非常规的方法,但它应该只是在构造函数本身中初始化。 -
只要有合理的工作量被执行,缓存就有意义,因此缓存结果将改善第二次访问的响应时间。 话虽如此,与每个缓存一样,它可能会变脏,这可能是需要考虑的,也可能不是需要考虑的。 此缓存是否有帮助取决于使用此模型的确切控制器/操作逻辑和视图逻辑。 我想说的是,在大多数情况下你是对的,这可能是不必要的,因为它是一个 Web 应用程序,每个请求都会创建和销毁所有内容,除非您将数据存储在更永久的地方,例如会话或数据库。 此外,语句
var c = Areas;
甚至比构造函数中的类似调用更无用,因为Areas
getter 不存储任何内容,并且局部变量c
再次从未使用过。
某些人来说,将服务调用缓存到变量_client
中仅在以下情况下有用:a( 服务的初始化成本很高,并且 b( 如果单个 AreaModel
实例上的 Client
属性将在同一请求中多次访问。
再次查看代码似乎会导致无限循环,因为 Client
属性访问 Areas
属性,然后再次访问 Client
属性。