2008-10-01 2 views
5

나는 약간의 DI 초보자이기 때문에 이것이 잘못된 접근이거나 어리석은 질문이라면 나를 용서해주십시오.DI/IOC에 대한 매개 변수를 어떻게 주문해야합니까?

주문을 생성/업데이트하는 양식이 있고 표시 할 제품 및 고객 목록을 검색해야 할 필요가 있다고 가정 해 보겠습니다. 편집하고있는 Order 객체를 전달하려고하지만, ProductsService와 CustomersService를 종속물로 삽입하려고합니다.

그래서 서비스를 제공하기 위해 IoC 컨테이너 (어느 쪽이든간에)가 필요하지만 편집 할 Order 객체를 제공하는 호출 코드가 될 것입니다. ,

public OrderForm(Order order, ProductsService prodsSvc, CustomersService custsSvc) 

... 또는 종속성은 마지막 순서 개체를 먼저 와서해야합니다

나는 첫 번째 매개 변수와 그 후 ProductsService 입력하고 CustomersService으로 주문 객체를 복용으로 예를 생성자를 선언해야 예 :

public OrderForm(ProductsService prodsSvc, CustomersService custsSvc, Order order) 

중요합니까? 내가 사용하는 IoC 컨테이너에 의존 하는가? 아니면 "더 나은"방법이 있습니까?

답변

4

나는 @ aku의 대답에 동의하지 않습니다.

나는 당신이하고있는 일이 훌륭하다고 생각하며, 다른 방법으로도 그럴 수 있다고 생각합니다. 예를 들어,이 객체가 처음에 서비스에 의존해야하는지 의문을 제기 할 수 있습니다.

DI에 관계없이 실제 상태 (Order), 파생 상태 (있는 경우) 및 종속성 (서비스)과 같이 각 객체가 보유하고있는 상태의 종류를 최소한 명확히하는 것이 도움이된다고 생각합니다. 어떤 생성자 또는 방법에

http://tech.puredanger.com/2007/09/18/spelunking/

, 나는 실제 데이터가 먼저 전달하고 의존성 또는 외부 물건이 마지막으로 전달하는 것을 선호합니다. 그래서 당신의 예제에서 나는 첫번째를 선호합니다.

5

Matt, 일반 매개 변수와 종속성을 섞어서는 안됩니다. 개체가 IoC 컨테이너의 내부에 만들어 지므로 필요한 인수를 어떻게 지정 하시겠습니까?

의존성과 일반적인 인수를 섞으면 프로그램 논리가 더 복잡해집니다.

이 경우 종속성 속성을 선언하는 것이 더 (즉 생성자의 종속성을 제거) 또는 IOC는이 OrderForm를 생성하고 그것의 분해 후에 순서 필드를 초기화 할 종속성 (즉 생성자에서 정상 파라미터를 제거).

또한 주문을 비롯한 모든 매개 변수를 종속으로 선언 할 수 있습니다.

+0

좋습니다. 따라서 모든 의존성에 대해 속성 주입을 사용하거나, 의존성을 ctor에 전달하고 "필요한"객체에 대한 속성을 도입합니까? –

+0

네, 맞습니다. 예상치 못한 문제를 야기하고 적절한 IoC 프레임 워크의 범위를 제한 할 수 있으므로 DP와 일반 속성을 함께 사용하지 마십시오. – aku

3

Order 인스턴스에 대한 필수 참조없이 인스턴스화 할 수있는 OrderForm 인스턴스 허용에 대해 약간 불안합니다. 이유 중 하나는 null 주문에 대한 선행 검사를 수행하지 못하게하는 것일 수 있습니다. 더 이상의 생각?

OrderForm 개체는 IoC 프레임 워크를 호출 한 후 Order 속성이 설정되도록하는 Factory 메서드에 의해서만 인스턴스화된다는 것을 알면 안심할 수 있다고 생각합니다.

+0

필자의 대답은 필수 ** 주문 ** 매개 변수를 포함한 여러 가지 접근 방식을 제안했습니다. 그러나 DP와 정상 특성을 혼합하는 것에 관한 질문이있었습니다. 내 대답은 - 혼합하지 마십시오. 건설적인 비판을 듣게되어 기쁩니다. – aku

관련 문제