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