3

나는 최근에 많은 의존성 주입, 테스트 주도 개발 및 단위 테스트를 사용 해왔고 그것을 사랑하기 시작했습니다.생성자 주입/의존성 삽입 - '루트'클래스 다루기

클래스에 생성자 종속성을 사용하므로 단위 테스트를위한 모의 의존성을 주입 할 수 있습니다.

그러나 프로덕션 환경에서 실제로 개체를 원할 때이를 처리하는 가장 좋은 방법은 무엇입니까?

DependencyInjectionContainer.Get<MyClass>()을 사용하여 클래스를 만들고 싶습니까? 또는 DI 컨테이너를 통해 모든 종속성을 해결하는 클래스의 빈 생성자를 만드는 것이 더 합리적입니까?

+0

관련 항목 : http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve-dependencies-forent-business-objec – Steven

답변

2

기본 생성자가 필요하지 않습니다.

프로덕션 코드에서 루트 유형 (예 : MVC의 HomeController 클래스)을 얻으려면 일반적으로 응용 프로그램에서 DependencyInjectionContainer.Get(someRootType)을 한 번 호출하면됩니다. 모든 유형은 생성자 삽입을 사용하여 작성되므로 컨테이너는 관련 객체의 전체 그래프를 작성할 수 있습니다. 따라서 프로덕션 관점에서 생성자를 두 개 이상 가질 필요는 없습니다.

단위 테스트에서 일반적으로 모든 모의 객체를 주입하기 때문에 테스트에서 기본 생성자를 사용하지 않습니다. 반면에 각 테스트가 테스트중인 클래스의 생성자를 직접 호출하게되면 곧 생성자가 변경 될 때 모든 테스트를 변경해야하기 때문에 곧 유지 보수하기 어려운 코드가 생성됩니다. 대신, 테스트 클래스 내의 팩토리 메소드에 로직을 집중 시키십시오. 이 팩토리 메서드는 테스트에서 테스트중인 클래스를 쉽게 만들 수 있도록 여러 오버로드를 가질 수 있습니다.

+0

감사합니다. for :) 그러나, 당신이 'var product = new Product();'와 같이 아이템을 new() 할 때 당신은 무엇을 할 것인가? 'var product = DI.Get ();'과 같은 것을 할 수 있습니까? –

+1

엔티티는 수명이 짧으며 일반적으로 컨테이너에서 생성되지 않습니다. 그들은 일반적으로'IUnitOfWork' 또는'IRepository '에 의해 생성됩니다. – Steven

+1

@KarlCassar : Steve가 말한 내용에 덧붙이면 : "Serivce"유형의 객체가 생성되고 DI 컨테이너에 의해 함께 연결됩니다. 서비스 개체는 "엔터티"개체를 만들 수 있습니다. DI 정의는 어떤 서비스가 어떤 서비스와 통신 하는지를 정의하며, 서비스 자체는 엔티티를 전달함으로써 서로 통신합니다. –