2010-08-17 5 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

응용 구조 및 디자인은 주로 선호 사항입니다. 그것을 올바르게하는 많은 방법과 그것을 잘못하는 많은 방법이 있습니다. 내가 할 일을 적어두고 가치가있는 것을 위해 취할 수 있습니다 ...

데이터베이스에있는 각 개체 또는 테이블에 대해 하나의 간단한 데이터 액세스 리포지토리가 있습니다. 나는 보통 그러한 저장소가 간단한 제네릭 인터페이스를 구현하도록한다. 그런 다음 각각의 간단한 인터페이스를 구현하고 "집계"의 모든 기능을 한 곳으로 가져 오는 일종의 "서비스"또는 "공급자"를 만듭니다. "집계"란 비슷한 기능 (블로그, 상점, 로깅 등)을 공유하는 클래스와 객체 그룹을 의미합니다. 나는 끊임없이이 처리하는 더 나은 방법을 찾고 있어요하지만이 거친 내가 이것을 위해 사용하는 것이 클래스와 인터페이스의 추정치이다 : 행동의 방법은 당신의 컨트롤러에 넣어 무엇에 관해서는

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

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

? 나는 기본적인 RESTful 접근 방식이 작동하지 않는 시나리오를 거의 찾지 못한다. Add, List, Show, Delete/Destroy, Edit 액션으로 할 수있는 일은 많지 않습니다.

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

+0

@DM, 나는 DDD 방식으로 갈 것이고, 그래서 나는 단지 당신에게 인터페이스를 주었다. 해당 범주 내에서 '범주'와 모든 '제품'을 반환해야하는 경우이 방법을 'CategoryRepository'또는 'ProductRepository'에 입력해야합니까? –

+0

@mare My IRepository 클래스는 구현 방법이 5 개 또는 6 개로 매우 기본입니다. 나는 제 응답을 날아 다니며 옳지 않은 것을 발견했습니다. 설명을 위해 편집을 참조하십시오. –

0

조치가 다시 카테고리를 제공하면 카테고리 컨트롤러에 넣으십시오. 제품을 돌려 준다면 제품 컨트롤러에 넣으십시오. 리포지토리에 대해서도 마찬가지입니다.

그건 간단합니다. 그러나 나는 그것이 귀하의 경우에 효과가 있다고 생각합니다.