2013-12-08 20 views
3

我正在從事ASP.NET MVC 4項目。我有ViewModel是:如何將所有對象從一個IList移動​​/複製到其他

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;//??? 

所以menudocs從數據庫中提取。當我創建SectionModel的新實例時,我想傳遞這些值,但我不確定什麼是正確的方法。事實上,如何分配單個對象menuIList<Document> docs

我在想model.Menu.Add(menu),然後一些的foreach一樣:

foreach (var doc in docs) 
{ 
    model.Documents.Add(doc); 
} 

,但我不知道這是做到這一點的正確方法。

+0

你應該嘗試'綁定'或'映射'的項目。檢查'Automapper' –

+1

你也可以做一個演員。 –

+0

@Leron:查看我的答案以反駁論點。 :) –

回答

1

我建議接口,如果你的代碼應與其他項目進行互操作,但下面使用的是始終List<T>

你必須改變這種

public class SectionModel 
{ 
    public Menu Menu { get; set; } 
    public List<Document> Documents { get; set;} 
} 

,並使用

model.Documents.AddRange(docs); 
+0

我不知道爲什麼,但我不能使用'AddRange'我只有'添加'... – Leron

+0

是否有您的文件類型列表

+0

它是'IList',你可以看到。你建議將其更改爲'List'並使用'AddRange'? – Leron

3

有我總是看到一種常見的思路,即在聲明屬性時使用接口聲明列表(或其他集合類型) 。我明白這樣做的動機,如果你決定拋棄標準的.NET List<>類來支持你的本土。

我還沒有看到一個體面的原因。即使它們不是特別相關的「成語」,你也會犯下「讓所有情況都被抽象化」的問題。 (讓我們不要忘記,在波蘇斯接口不是特別ORM友好。)

如果我設計一個API,我威力使用IList,即使一切都與一個內部工作List。事實是,這有點不恰當。我從來沒有理由使用IList<>,因爲這就是...程序錯誤。

正如朱莉所說,換掉那個界面,並在那裏放置一個體面的課程(例如,List<>)..不僅是具體的,但你可以使用它,因爲它應該使用。人們喜歡帶上interfaces always in case I change my mind的條款,但這只是糟糕的設計。

不要害怕使用真實的具體類。

+0

事實上,在一些PHP和Java背景下,它讓人覺得在C#界面中使用的頻率要高得多。說實話,我不確定如何選擇,我認爲需要對語言有充分的理解才能真正瞭解每種情況下的贊成和反對,但這並不能改變事實,即確實使用了接口。 – Leron

+0

@ Moo-juice:對不起,我不完全同意。你爲什麼要改變你的'模型'對象?畢竟,它的唯一目的是代表信息,'IList'在這裏看起來不錯。只是使用'AddRange'擴展方法,改爲'List'看起來不是必需的。 –

+0

@nowhewhomustnotbenamed。一個公平的點 - 但如果我們沿着這條路線走下去,那麼它肯定會超越界面級別的收集?你說的是純粹因爲單一方法而使它成爲'List'而不是'IList'是推理。我們在這裏談論POCO,我希望我能得到一份東西的清單。 –

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只是保持代碼可讀。

+0

謝謝,解釋。我從來沒有使用過'AutoMapper'。這似乎很有趣。儘管我正在尋求更自然的C#方法。使用第三方lib似乎有點矯枉過正。 – Leron

相關問題