【问题标题】:Better way to handle screen scrape object处理屏幕刮擦对象的更好方法
【发布时间】:2009-10-12 15:09:55
【问题描述】:

在我的应用程序中,我总是最终实现模型-视图-演示者模式,并且通常最终使用 get 属性从屏幕上删除我的视图对象。

例如

Person IBasicRegistration.Person
{
 get
 {
  if (ViewState["View.Person"] == null)
   ViewState["View.Person"] = new Person();

  var Person = (Person) ViewState["View.Person"];

  Person.Email = txtEmail.Text.Trim();
  Person.FirstName = txtFirstName.Text.Trim();
  Person.LastName = txtLastName.Text.Trim();
  Person.Zip = txtZip.Text.Trim();
  Person.Phone = txtPhone.Text.Trim();
  Person.ResidentPersonLicenseState = 
        EnumerationParser.Parse<States?>(ddState.SelectedValue);

  return Person;
 }
}

但是在调试过程中,我注意到当我在 Presenter/Model 中访问 IBasicRegistration.Person 时,我得到了我的 get { } 属性的相当多的遍历。

我开始认为这种模式似乎与 INotifyPropertyChanged 模式非常相似,我开始考虑实现一个类似的模式并让每个文本字段实现一个 OnChanged 事件,该事件将更新它在位于视图状态的 person 对象中的相关值我越想越深,每次一个人将鼠标移出字段时,它都需要大量的服务器请求,并且似乎在某些时候可能会导致可伸缩性问题。

我的下一个想法是创建一个 IsDirty 标志并将我的代码包装在它涉及类似于以下字段的位置:

Person IBasicRegistration.Person
{
 get
 {
  if (ViewState["View.Person"] == null)
   ViewState["View.Person"] = new Person();

  var Person = (Person) ViewState["View.Person"];

  if(IsDirty)
  {
      Person.Email = txtEmail.Text.Trim();
      ...others

      IsDirty = false;
  }

  return Person;
 }
}

并在任何调用回发的方法(即通常只是提交按钮)上设置 IsDirty = true,然后它将无缘无故地跳过大量重复工作。

有没有人想出更优雅的方法来完成这项任务?

【问题讨论】:

  • 我会说你的概念是经过深思熟虑的。如果它已经实施并且已经工作,也许你应该坚持下去。当然,除非有人提出了一些非常优雅且易于实现的东西。
  • “scrap”与“scrape”不同,“scrapping”与“scraping”不同。
  • 非常有见地的评论先生语法纳粹。
  • @Cris:这让我很困惑。

标签: c# asp.net screen-scraping mvp


【解决方案1】:

我认为断开连接的地方是您通常在创建视图时实现视图。一个典型的场景是表单实现了一个视图接口,然后在应用程序对象中注册自己(或被注册)。然后,您可以随时使用视图的各种属性找出为某个人输入的内容。

例如,要找出你输入的名字,你会去

 myVariable = PersonView.FirstName();

在您的示例中,您每次访问人员时都会拉取视图的状态。即使您只是想要电子邮件,您也需要提取所有内容并将其放入状态变量中。

现在,如果数据结构 Person 是您的模型的一部分。那么这可能没问题。当它被改变时,你把它拉出来一次。修改或将其添加到模型中,然后其他所有内容(报告等)都会查看模型。

但是,您的问题表明它一次又一次地受到打击。这使我认为 Person 出于各种原因直接从视图中访问。在这种情况下,我会将属性放在允许访问各个成员的视图上。

或者我会重构设计,以便一切都使用模型来获取数据,并且每次视图更改时都会更新模型。我怀疑您此时可能不想这样做,因此最好的方法是使用单个属性。

【讨论】:

  • 将所有内容都公开为属性的不利方面是:PersonFirstName、PersonLastName 等,它所要做的就是延迟将它们全部滚动到一个人对象中,或者让我的模型方法被替换为使用该人对象并接受巨大的参数列表。我想我可以接受用属性列表而不是单个对象来包装我的视图,如果有人可以就为什么这违反任何现代设计惯例提出令人信服的论据。
  • 您的 person 对象驻留在模型中的某处。您的 Presenter 应该足够聪明,可以从视图中提取并更新模型。它是拉一个人对象还是一个单一的属性都没有关系。优点是允许属性访问是您可以从视图中提取尽可能多或尽可能少的内容。使用您当前的方法,您只能从视图中拉出整个人对象。对于有意义的命令,您仍然可以使用该功能。但是有了属性,当你只想要一件事时,你就有了一种明确的方式来提取一件事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2013-11-09
  • 1970-01-01
相关资源
最近更新 更多