2010-08-17 95 views
2

我在ASP.NET MVC中構建網店。
我有兩個實體:類別產品
應用程序設計問題

一個產物可以屬於一個或多個類別

在網頁上,用戶可以看到一個類別列表。通過點擊分類名稱,他可以看到該分類中的所有產品。用戶還可以通過名稱,類別,價格搜索產品等

控制器
我應該把哪些動作在類別控制器和我應該把在產品控制器,它的行動?


我需要兩個儲存庫(每個實體),如果我這樣做,哪些方法屬於哪個庫:

IList<Category> GetCategories(); 
IList<Product> GetProducts(int categoryId); 
Product GetProductById(int productId); 
IList<Product> GetProducts(string name, decimal? minPrice, decimal? maxPrice); 

謝謝您的幫助!

回答

1

應用程序結構和設計在很大程度上是一個偏好問題。有很多方法可以做到這一點,並有很多方法可以做到這一點。我會寫我會做什麼,你可以拿它的價值...

我喜歡有一個簡單的數據訪問存儲庫爲我的數據庫中的每個對象或表。我通常使這些存儲庫實現一個簡單的通用接口。然後,我創建一個實現每個簡單接口的「Service」或「Provider」,並將「聚合」的所有功能集中到一個地方。 「聚合」是指一組類和對象,它們都具有相似的功能(例如,Blog,Shop,Logging等)。我不斷地尋找更好的方法來處理這個問題,但是這是我會用這個類和接口的粗略估計:

// interfaces 
IRepository<T> 
IProductRepository : IRepository<Product> 
ICategoryRepository : IRepository<Category> 
IShopService 

// concrete implementations 
LinqToSqlProductRepository : IProductRepository 
LinqToSqlCategoryRepository : ICategoryRepository 
ShopService : IShopService 

至於什麼動作的方法把你的控制器?我很少發現一種基本的RESTful方法無效的場景。添加,列表,顯示,刪除/銷燬,編輯操作沒有太多。

// example ProductController 
Add() 
Add(ProductAddModel) 
Delete(int id) 
Edit(int id) 
Edit(ProductEditModel) 
List(int page) 
Show(int id) 

編輯:

考慮看看後,我改變了簽名:

IShopService:IProductRepository,ICategoryRepository

到:

IShopService

原因是因爲我在IProductRepository和ICategoryRepository後面都使用了通用接口,所以當你去實現IShopService時,你將有多個Add(),Delete(),FindAll(),FindByID()等等。方法;只有他們的參數不同。

一個更好的方法是僅僅擁有IShopService接口,並使該接口的具體實現與IProductRepository和ICategoryRepository一起工作。

+0

我以某種方式不喜歡存儲庫體系結構中的泛型方法,因爲它將您的「子」存儲庫鎖定到相同的一組方法,而我通常會在不同的實體之間產生一些不同的方法。但是,如果一個只有存儲庫中的Add(),Delete(),Update()方法,那麼我猜測它是有效的。除此之外,很好的答案。 – mare 2010-08-18 01:47:11

+0

@DM,我要用DDD的方法,這就是爲什麼我只給你接口。如果我需要返回該類別中的「類別」和所有「產品」,是否必須將此方法放在「類別庫」或「產品庫」中? – 2010-08-18 07:16:54

+0

@mare My IRepository 類是相當基本的,只有5或6個方法來實現。我立即打出我的迴應,並注意到一些不正確的事情。請參閱編輯以進行澄清。 – 2010-08-18 14:10:53

0

如果該操作返回類別,請將其置於類別控制器中。如果它給你回產品放在產品控制器。存儲庫也一樣。

這很簡單,但我認爲它適用於您的情況。