3

나는 웹 사이트 프로젝트에 대해 ASP.NET MVC을 사용하기로 결정했으며 작성된 모범 사례를 따르기를 원합니다.IoC가 ASP.NET MVC 컨트롤러 생성자에 너무 많은 매개 변수를 사용합니까?

그래서, 별도의 프로젝트 생성 IRepositories 콘크리트 저장소에 도메인/모델을 분리했으며 이제 IOC의성 윈저에 내 관심을 돌았 다.

지금 직면하는 문제는 특정 컨트롤러의 경우 생성자에서 여러 개의 IRepository 매개 변수를 전달해야한다는 것입니다.

내 질문은 :

  1. 나는 아마도 너무 많은 저장소를 만들었습니다 - 일반적으로, 나는 1 저장소에 엔티티 클래스 1-1 데이터베이스 테이블을 매핑합니다. 내 리포지토리가 하나 이상의 엔티티/db 테이블을 효과적으로 포함해야합니까?
  2. IoC 및 Dependency Injection에 대한 요점을 놓쳤으며 매개 변수가 Controller 생성자로 전달되는 방법에 관심을 두지 않아야합니까?

일종의 문맥을 말합니다. 웹 사이트의 일부는 속성 유형 (성, 하우스 등 펍), 위치 (우편 번호, 도시), 개방 시간 등 그래서, 이러한 검색 구성 요소가 있습니다에 의해 검색 할 속성의 구글지도를 표시합니다 모든 개별 엔터티 PropertyType, Address.City, Address.Postcode.Lat + Long, OpeningTime.DateTime. 따라서 SearchController 생성자로 전달되어야하는 3 개의 별도 리포지토리도 있습니다.

이것은 간단한 예이지만 앞으로 더 많은 저장소 매개 변수가 다른 컨트롤러로 전달되는 것을 상상할 수 있습니다.

희망 사항.

답변이나 조언을 주셔서 감사합니다.

답변

3

IoC가 생성자에 전달하는 매개 변수의 수와 관련하여 IoC가 모든 논리를 처리합니다.

컨트롤러가 너무 많은 매개 변수로 끝나면 컨트롤러의 기능을 분해하거나 로직을 서비스 클래스로 옮길 것입니다.

저장소의 경우 일반적으로 구현시 단일 엔터티를 사용하는 일반 저장소를 사용합니다. 그런 다음 해당 정보를 논리적 단위로 집계하는 서비스 클래스가 있습니다. 이 시나리오에서 컨트롤러는 서비스에 대한 액세스 만 필요로합니다. 예 :

interface IRepository<T> 
{ 
    IQueryable<T> GetAll(); 
    T GetOne(int id); 
    void Save(T item); 
    void Delete(T item); 
} 

class OrderService 
{ 
    public OrderService(IReopository<Order> orderRepository, IRepository<OrderDetail> orderDetailRepository, IRepository<Payment> paymentRepository, etc) { } 

    public Order CreateOrder(List<OrderDetails> details) 
    {} 
    // .. other aggregate methods 
} 
+0

답변 해 주셔서 감사합니다. 2 질문에 따라 주시기 바랍니다 : 1) 컨트롤러 생성자의 params 수와 관련이 없다고 할 때 - 그래도 실제로 생성자를 코드화해야합니다. IoC는 실제로 생성자에 대한 코드를 만들지 않습니다. 2) 아마도 Service 클래스에는 인터페이스 만 포함되어 있으므로 인터페이스 (IOrderService)가 아닌 클래스로 Controller에 전달할 수 있으며 문제가 분리되어 쉽게 테스트 할 수 있습니까?다시 한 번 감사드립니다 –

+0

1) 예, 당신은 여전히 ​​완전히로드 된 생성자를 설정해야합니다. 2) 컨테이너는 인터페이스를로드 할 때 사용할 클래스 인스턴스를 처리합니다. 이 최근 질문을 참조하십시오. 도움이 될 수있는 두 가지 답변을 작성했습니다. http://stackoverflow.com/questions/871405/why-do-i-need-an-ioc-container-as-opposed-to-straightforward-di-code – bendewey

관련 문제