我有一个疑问,我承认我是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。创建嵌套映射很容易,但是内存消耗吗?
谢谢..我知道我是新手,我正努力做到最好:)
答案 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