型號:構建Asp.Net的IEnumerable的ViewModels與預先加載和自定義業務邏輯
public class Company
{
public string Name {get;set;}
}
public class JobListing
{
public string Title {get;set;}
public Company Company {get;set;}
public bool JobListingHasRecommendation {get;set;}
}
視圖模型:
public class JobListingVM
{
public string Title {get;set;}
public string CompanyName {get;set;}
public string TitleAtCompany
{
get
{
return string.Format("{0} at {1}", Title, CompanyName);
}
}
}
庫方法:
public IEnumerable<JobListing> getAllJobs()
{
return dbContext.JobListings;
}
控制器動作:
public ActionResult Index()
{
var jobs = repository.getAllJobs();//jobs is now disconnected from the dbcontext
//let's say there are a thousands of jobs (and we will be paging)
//now we use some Automap like magic to convert the IEnumerable<JobListing> into
//IEnumerable<JobListingVM>
}
的問題是getAllJobs必須或者急於負載的公司財產 和自動映射過程依賴於這方面的知識 或自動映射運行N個工作崗位N次查詢,以獲得公司 - 這顯然是不好的做法
雖然對此的解決方案可能是急於加載 存儲庫中的公司屬性,然後在不希望進行急切加載的情況下會發生什麼情況。 我們需要很多組合庫方法來提供所有急切/懶惰的加載(使用 潛在的嵌套加載等)場景?
VieModel的JobListingHasRecommendation屬性也是一個問題,因爲它需要包含db查詢的自定義業務邏輯來設置它,所以這需要按照JobListing爲所有IEnumerable成員完成。在存儲庫調用之後在控制器內部執行此操作很麻煩,並且在自動映射中執行此操作需要將IRepository注入到Automapping構造中。
模型到ViewModels的映射並不像我看到的所有自動映射示例一樣簡單。我很少看到一個示例,其中模型列表映射到ViewModel列表,並且每個ViewModel的JobListingHasRecommendation必須單獨計算。這裏有性能和體系結構的問題,因爲自動映射服務現在也必須有數據庫訪問...
我的問題是 - 由於ViewModels存儲的數據可能是複雜計算結果和順序數據庫訪問的結果,創建這些類型的ViewModel的IEnumerable的最佳實踐。
感謝
你試過一個倉庫專門只爲與光模型查詢?基本上,存儲庫將直接返回視圖模型(或其部分)。存儲庫將負責查詢orm並只獲取所需的列。您當前的存儲庫方法不會執行任何操作,只需選擇所需的數據,然後將其直接映射到視圖模型。 – MikeSW 2012-03-07 19:08:24
MikeSW - 您將如何確定爲同一實體的許多不同子選擇(或包含)返回的類合同?你可以選擇幷包含方法參數(對於select使用動態linq,對於include參數使用EF字符串包含功能),但對於這種靈活的選擇回購方法,返回類型是什麼? – t316 2012-03-07 21:23:14