我正在研究ASP.NET MVC 4
项目。我有ViewModel
:
public class SectionModel
{
public Menu Menu { get; set; }
public IList<Document> Documents { get; set;}
}
然后在我的行动中我有:
Menu menu = unitOfWork.MenuRepository.GetById(Id);
IList<Document> docs = unitOfWork.DocumentRepository.GetBy(x => x.MenuID == menu.MenuID).ToList();
SectionModel model = new SectionModel();
model.Menu = menu;//???
model.Documents = docs;//???
因此从数据库中获取menu
和docs
。当我创建SectionModel
的新实例时,我想传递值,但我不确定什么是正确的方法。实际上,分配单个对象menu
和IList<Document> docs
?
我在考虑model.Menu.Add(menu)
,然后是一些类似的预言:
foreach (var doc in docs)
{
model.Documents.Add(doc);
}
但我不确定这是否正确。
答案 0 :(得分:3)
我总是看到一个共同思路,即在声明属性时使用接口来声明列表(或其他一些集合类型)。我理解这样做的动机,如果你决定抛出标准的.NET List<>
课程,而不是你的本土课程。
我还没有看到一个合理的理由。你对“让所有情况下的所有内容都抽象出来,即使它们并不是特别相关”也是如此。 (我们不要忘记,POCO上的接口并不特别对ORM友好。)
如果我正在设计API,我可能会使用IList
,即使内部的List
一切正常。事实是,这有点用词不当。我从来没有理由使用IList<>
,因为这就是......程序化的误称。
正如朱莉所说,换掉那个界面并在那里放一个体面的类(例如List<>
)..不仅具体,而且你可以使用它,因为它应该被使用。人们喜欢关注interfaces always in case I change my mind
的条款,但这只是糟糕的设计。
不要害怕使用真正的具体课程。
答案 1 :(得分:1)
如果您的代码应与其他项目互操作,但我在下面使用List<T>
你必须改变这个
public class SectionModel
{
public Menu Menu { get; set; }
public List<Document> Documents { get; set;}
}
并使用
model.Documents.AddRange(docs);
答案 2 :(得分:1)
如果您考虑使用AutoMapper
,请输入以下代码:
首先,确保安装了AutoMapper
。使用package-manager
并输入命令package-install AutoMapper
。
var anonymous = new {
Menu = unitOfWork.MenuRepository.GetById(Id);,
Documents = unitOfWork.DocumentRepository.GetBy(x => x.MenuID == menu.MenuID).ToList();
};
var sectionModel = AutoMapper.Mapper.DynamicMap<SectionModel>(anonymous);
为什么我建议使用它?
第1点:IList
在这里很好。有人(或你)在设计过程中放在那里,这很好。据我所知,改为List
是不必要的。您的model
对象就在那里放置信息,IList
很好,因为您的sectionmodel
类不会更改或删除任何条目。因为它只是enumeration
的罚款。
第2点:您可以进行手动映射。但是,AutoMapper
只是维护代码可读。