2011-08-12 42 views
2

目前我的網站有一個存儲庫模式和規範模式。我可以從我的.aspx頁面中的代碼,例如只需要幾行得到的數據:實體框架 - 關於業務層需求的意見

private IRepository repository; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     repository = new GenericRepository(); 

     Specification<Book> specification = new Specification<Book>(b => b.Year == 1988); 
     lvBooks.DataSource = repository.GetAll<Book>(specification); 
     lvBooks.DataBind(); 
    } 

現在的問題是,我在我的網站,如果你的答案是肯定需要一個業務層,爲什麼呢? 目前看來,由於規範模式,我不需要位於頁面和存儲庫之間的業務層。

感謝您的意見。

回答

3

答案取決於這個應用程序有多大,它將得到多大,以及它可能會改變多少。

任何層的唯一真正的點是隔離功能。在一個小應用程序中,您可以愉快地調用散佈在整個UI代碼中的存儲庫。

但是,如果您然後改變了存儲庫的結構方式?您需要查找並更改所有這些引用。

但是,如果您將業務層中的所有存儲庫訪問代碼寫入UI並向UI公開更高級別的方法,那麼此時您的工作量就會減少很多。

可能有特定的安全考慮因素。例如,如果您的用戶界面無法訪問存儲庫,那麼您可以將所有安全檢查集中在業務層的公共API上。如果你有一個200頁的網頁應用程序,可以從任何地方訪問存儲庫 - 當然它可能是安全的 - 但你有多確定?

然後是單元測試......基本上沒有正確的方法 - 但是如果你的應用程序很小,那麼很好......如果你的應用程序很大,你可能會後悔這個設計點。

+0

它最終會成爲一個大網站,所以你應該說做一個BLL?我應該如何使用此規範存儲庫查看業務層? (我的存儲庫是通用的,數據庫有超過30個表格,那麼我應該爲每個實體編寫一個業務對象? – Julian

+0

非常困難的問題!我會先忘記UI和存儲庫,然後考慮業務領域並寫入一個似乎自然適合該領域的API如果你的存儲庫設計得很好,它應該能夠很容易地支持這個API,否則你可能需要更改存儲庫然後編寫UI來使用這個API。你可能需要在API中添加一些額外的方法來支持特定的用戶界面需求,但如果可以的話,儘量避免這種情況......已經有無數書籍在這個主題上寫過......這是我在6行中最好的。 –

+0

哈哈,謝謝,我會考慮一種方法來完成這項工作,儘管如果在我的通用知識庫中構建一個好的BLL工作似乎很多(因爲通用BLL不能爲特定實體提供方法嗎?) – Julian

1

從你的代碼看來,你不需要業務層。因爲它似乎完全是關於使用簡單規範或可能插入數據的數據獲取。當你對這些對象有一些商業規則時,需要BL,例如:刪除一個對象應該在刪除對象之前檢查一些特定的條件等。

+0

感謝您的回答,確實沒有關於是否刪除對象的真實規則。但是,如果我直接與存儲庫交談,是否存在安全問題或類似的問題? – Julian

+0

我不認爲有任何「安全問題」,而是它使您的代碼簡單,沒有額外的層之間的額外開銷 – Ankur

+0

好吧,似乎合乎邏輯,謝謝你的意見Ankur,我想等待一些更多的oppinions如此我不會接受答案。謝謝! – Julian