2012-03-07 43 views
1

型號:構建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的最佳實踐。

感謝

+0

你試過一個倉庫專門只爲與光模型查詢?基本上,存儲庫將直接返回視圖模型(或其部分)。存儲庫將負責查詢orm並只獲取所需的列。您當前的存儲庫方法不會執行任何操作,只需選擇所需的數據,然後將其直接映射到視圖模型。 – MikeSW 2012-03-07 19:08:24

+0

MikeSW - 您將如何確定爲同一實體的許多不同子選擇(或包含)返回的類合同?你可以選擇幷包含方法參數(對於select使用動態linq,對於include參數使用EF字符串包含功能),但對於這種靈活的選擇回購方法,返回類型是什麼? – t316 2012-03-07 21:23:14

回答

0

指定想要躍躍欲試負載通過包括(),並返回ToList()

 
return dbContext.JobListings.Include(o=>o.Customers).ToList(); //or whatever you want to eager load