ViewModel嵌套引用:性能问题?

时间:2013-01-27 10:29:21

标签: performance asp.net-mvc-4 asp.net-mvc-viewmodel

我有一个疑问,我承认我是c#和软件架构的初学者。 我正在研究ASP.NET MVC4 + EF5,我正在尝试使用三层架构构建我的应用程序。

在我的BL中我创建了这两个视图模型:

字符

namespace BL
{
  public class WordViewModel : IWord
  {
    [Required, ReadOnly(true)]
    public int WordId { get; set; }
    public string LanguageId { get; set; }
    public int VocabularyId { get; set; }

    public LanguageViewModel Language { get; set; }    
    public VocabularyViewModel Vocabulary { get; set; }    
  }
}

词汇

namespace BL
{
  public class VocabularyViewModel : IVocabulary
  {
    [Required, ReadOnly(true)]
    public int VocabularyId { get; set; }
    public string Name { get; set; }
    public List<WordViewModel> Words { get; set; }
  }
}

Debugguing我注意到(并且很明显)有一种“嵌套循环”,我的意思是一个Word包含一个词汇表,其中包含一个单词列表,每个单词包含一个词汇表,其中包含一个单词列表。 ..等等。

在教程之后,在我看来,我写的内容是正确的......但我在考虑性能和内存消耗......这是一个问题吗?(但应该是我的设计也是错的,我希望不是)

此外,但这不是一个大问题,我使用 AutoMapper 将我的DAL层(实际上是WordRepository和VocabularyRepository)提供的对象映射到我的viewmodel。创建嵌套映射很容易,但是内存消耗吗?

谢谢..我知道我是新手,我正努力做到最好:)

1 个答案:

答案 0 :(得分:2)

您应该尽量避免模型中的双向关系。通常没有必要,他们需要维护很多额外的代码。例如,我没有看到任何代码确保在单词添加到词汇表时,词汇表的引用是在单词模型上设置的。这样,模型很容易陷入无效状态。

在这种情况下,我认为您不需要在单词模型中引用词汇表。可以通过存储库检索词汇表,然后您可以通过List属性访问单词(EF将为您加载它们)。

此外,您似乎混淆了视图模型和模型。模型是问题域的表示,这些模型通常会保存到数据库中。 Viewmodels是专门定制的类,包含特定视图的所有信息,它们通常位于Web层本身,因为它们与视图紧密耦合。 Viewmodels可以包含从多个模型对象检索的信息。 Automapper通常用于从模型对象创建视图模型。

存储库是检索和存储模型的类。它们看起来像这样:

public class VocabularyRepository
{
  public Vocabulary Get(int id)
  {
    ... 
  }

  public void Save(Vocabulary vocabulary)
  {
    ...
  }
}

这里有很多值得学习的东西,希望这会让你朝着正确的方向前进。 有关asp.net mvc架构的更多信息,请查看此问题:https://softwareengineering.stackexchange.com/questions/30348/best-practices-for-mvc-architecture