2012-02-20 8 views
0

C# 및 면도기에 ASP.NET MVC3이 있습니다. 응용 프로그램의 아키텍처는 데이터 액세스 계층 (EF 클래스 + 저장소), 서비스 계층, 컨트롤러, ViewModels 및 뷰로 구분됩니다. 내가 메소드를 호출 내 서비스 레이어 ProductServices에서서비스 계층에서 EF 클래스 속성에 액세스하는 방법

은 다음과 서명이 내 저장소 ProductRepository에 의해 노출 GetAllProducts :

: 내가 전화 ProductServices 내의 따라서

IQueryable<Products> GetAllProducts() 

(productRepositoryProductRepository의 인스턴스)

var products = productRepository.GetAllProducts(); 

이 변수 products을 채 웁니다. 이제 제품 번호 ProductNameproductServices에서 액세스하고 싶습니다. 나는이 명령을 사용하는 경우 :

var productNames = products.Select(m => m.ProductName).ToList(); 

을 나는 ServiceLayerEF (저장소를 우회) 사이에 커플 링을 만드는 오전. 그건 내가 서명 ProductRepository에 메소드를 추가해야 함을 의미합니다 :

IQueryable<string> GetAllProductsName() 

을하지만, 내 응용 프로그램에서 다른 제품의 정보가 필요하기 때문에, 나는 Product 클래스의 각 필드에 productRepository 하나의 방법을 만들 수 있겠습니까? 내 논리가 맞습니까? 감사합니다

+0

요청을 프록시하기 위해 서비스 계층이 필요한 이유는 무엇입니까? – Eranga

+0

답변 해 주셔서 감사합니다. 물론 비즈니스 계층의 모든 비즈니스 논리와 여러 가지 방법을 사용할 수 있기 때문에 필요한 이유입니다. – CiccioMiami

+0

왜 이러한 유형의 연결이 좋지 않다고 생각합니까? – Eranga

답변

1

Theres는이 주변에 생각의 두 학교,

  1. 저장소는 명시 적으로 정의 데이터베이스와 상호 작용하고 엄격하게 통제되어야하는 방법. 따라서 저장소의 메소드는 열거 형 데이터를 제공해야합니다.
  2. 저장소는 특정 데이터 소스 유형에 대한 강력한 결합을 끊지 만 상세하고 열거 된 데이터 세트를 제공 할 필요는 없습니다.

는 개인적으로 내가 두 번째에 가입을 heres 이유 :

내 느낌은 당신이 저장소 내에서 지나치게 명시 적으로 얻을 때 비즈니스 로직보다는 디커플링 메커니즘으로 변하기 때문이다. 나는 당신이 저장소 구현과보다 긴밀하게 연결된다는 것을 의미하므로 실제로는이 것을 좋아하지 않는다.

또한 리포지토리가 데이터를 열거하는 올바른 위치가 아니라고 생각합니다. 예를 들어 페이징 및 정렬이 UI 관심사라고 생각하면 성능은 현재 페이지/정렬에만 관련이 있습니다. 이는 사용자가 UI를 쿼리 컴파일에 사용하도록하거나 리포지토리가 페이징 및 정렬을 이해할 필요가 있음을 의미합니다.

열거되지 않은 데이터 소스를 제공하면 나중에 트랙을 볼 때 문제가 열리게되며 가능한 한 빨리 세트를 열거하는 것이 매우 중요하다고해도 말입니다. 당신이 저장소에 내 걸릴을 heres 관심이 있다면

: http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html는, 모든 코드는 GitHub의에 있습니다

+0

답장을 보내 주셔서 감사합니다. 따라서 특정 메소드를 생성하지 않고 저장소를 우회하여 서비스 계층을 통해 필드에 액세스 할 것을 제안합니다. – CiccioMiami

+0

필자가 느끼는 것은 실제로 쿼리 할 수있는 것에 직접 액세스함으로써 저장소를 우회하는 것이 아니라 런타임 확장을하는 것입니다. 그래서 네, 저장소에서 다시 세트를 얻은 후에 select를 사용하면 문제가 없습니다. 또한 여기서는 select가 실제로 EF 나 저장소가 아닌 LINQ의 함수이며 열거 된 집합에서도 매우 행복하게 작동한다는 점을 유의해야합니다. –

+0

그리고 만약 내가 데이터베이스 (그리고 결과적으로 EF)가 대체 될 것이라는 것을 미리 안다면? 만약 내가 'productRepository'에서 필드에 접근하면 그 레이어를 바꿔야 만합니다. – CiccioMiami

0

당신은 방법 productRepository.GetAllProducts하여 저장소에서 모든 정보를로드 당신 때문에 productServices의 모든 정보를().다른 주체로부터 더 많은 정보가 필요하면 제품 서비스를 새로운 서비스로 확장해야합니다. 내 응용 프로그램에서 다른 제품의 정보가 필요하기 때문에

그러나, 는 내가 제품 클래스의 각 필드에 productRepository 하나의 방법을 만들 수 있겠습니까? 내 논리가 맞습니까? 감사합니다

이 상황에서는 일반적으로 서비스에 대한 확장 메서드를 만들고 리포지토리에 없습니다. Repository는 일반적으로 CRUD Setup을 가지고 있으며 그 이상은 없습니다.

+0

덕분에 서비스 레이어에서 직접 필드에 액세스 할 수 있습니까? 물론 GetAllProducts 외에도 다른 메서드가 있습니다. 질문의 범위를 벗어 났기 때문에 여기에 나열하지 않았습니다. – CiccioMiami

+0

이 경우 예입니다. 다른 응용 프로그램이나 데이터베이스 컨텍스트 (e.q WPF App 또는 Mobile App)에서이 논리가 필요한 경우에는 절대로 안됩니다. 서비스 아키텍처를 사용하면 이러한 상황을 좋은 방법으로 처리 할 수 ​​있습니다. – glenn