캐슬 윈저 란 무엇이며 왜 신경 써야합니까?


191

저는 오랫동안 Windows 개발자이며 win32 및 초기 COM에서 문제를 해결했습니다. 2001 년부터 .NET을 사용해 왔으므로 C #과 CLR에 능숙합니다. Stack Overflow에 참여하기 시작할 때까지 Castle Windsor에 대해 들어 본 적이 없습니다. Castle Windsor "시작하기"안내서를 읽었지만 클릭하지는 않습니다.

이 오래된 개에게 새로운 트릭을 가르치고 왜 Castle Windsor를 내 엔터프라이즈 앱에 통합해야하는지 알려주세요.


1
Inversion of Control을 읽으십시오. 의존성을 분리하는 데 도움이되므로 초보자를 위해 단위 테스트를 작성하는 데 많은 도움이됩니다.
Dan Csharpster

답변:


360

캐슬 윈저는 제어 도구의 역전입니다. 같은 다른 사람들이 있습니다.

미리 빌드되고 미리 연결된 종속성이있는 객체를 바로 제공 할 수 있습니다. "새"연산자가 아닌 반사 및 구성을 통해 생성 된 전체 객체 그래프.

여기에서 시작하십시오 : http://tech.groups.yahoo.com/group/altdotnet/message/10434


이메일 전송 클래스가 있다고 가정하십시오. EmailSender. 다른 클래스 WorkflowStepper가 있다고 상상해보십시오. WorkflowStepper 내에서 EmailSender를 사용해야합니다.

당신은 항상 말할 수 있었다 new EmailSender().Send(emailMessage);

그러나 그것의 사용은 new변경하기 어려운 TIGHT COUPLING을 만듭니다. (이것은 결국 작은 고안된 예입니다)

WorkflowStepper 내부에서이 나쁜 소년을 새로 만드는 대신 생성자에 전달한 경우 어떻게됩니까?

그래서 전화를 한 사람은 EmailSender를 새로 만들어야했습니다.

new WorkflowStepper(emailSender).Step()

하나의 책임 (Google SRP) 만있는 수백 개의 작은 클래스가 있다고 가정하고 WorkflowStepper에서 몇 가지 클래스를 사용한다고 가정 해보십시오.

new WorkflowStepper(emailSender, alertRegistry, databaseConnection).Step()

의 세부 사항에 대해 걱정하지 상상 EmailSender작성중인 경우 WorkflowStepper또는AlertRegistry

당신은 당신이 일하고있는 우려에 대해 걱정할뿐입니다.

RUN TIME에 객체와 종속성의이 전체 그래프 (트리)가 연결되어 있다고 상상해보십시오.

WorkflowStepper stepper = Container.Get<WorkflowStepper>();

WorkflowStepper필요한 곳에서 자동으로 채워지는 모든 종속성을 실제로 처리 합니다.

없습니다 new

그것은 무엇이 필요한지 알고 있기 때문에 발생 합니다.

또한 테스트 가능하고 반복 가능한 방식으로 더 나은 디자인의 DRY 코드로 결함을 줄일 수 있습니다.


30
대박! 잘 작성되었습니다! 지금 나는 그것에 대해 기쁘게 생각합니다.
David Hill

1
감사. 더 많은 것이 있습니다. 나는 매우 간단하고 고통스럽게 구체적인 예를 골랐다. 인터페이스를 사용하여 구현을 전환 할 수 있습니다. 전체 어셈블리를 자동 구성 할 수 있습니다. 싱글 톤 또는 http- 요청 당 등과 같은 라이프 사이클을 지정할 수 있습니다. 계속 진행하면 작업이 변경됩니다.
매트 힌지

6
그리고 자바 사람들을 돕기 위해 : 이것은 .NET ;-)에 대한 Guice입니다
마크 Renouf

5
내 경험상 객체가 초기화 된 곳이기 때문에 디버그하기가 더 어렵다는 것을 알았습니다. -대규모 프로젝트에서는 초기화의 근본을 찾기가 어렵습니다. 나는 구식을 사용하는 것을 선호합니다 new. 모든 것이 어디에 있는지 알고 있습니다. 또한 리플렉션 사용이라는 아이디어가 마음에 들지 않으며 실제로 블랙 박스이며 우리가 소유하지 않은 코드이므로 완전히 이해하지 못합니다.
Luke T O'Brien

1
@nashwan 예, 단위 테스트를 작성하고 있지만 IoC / DI의 원칙은 Castle Windsor 또는 타사 프레임 워크없이 적용 할 수 있습니다. 제 의견에 또 다른 의존성을 추가합니다. 캐슬 윈저의 장점은 보지 못합니다.
Luke T O'Brien


3

IoC는 개발팀 (PM, BA an BOs 포함)의 생산성 향상과 즐거움을 향한 올바른 방향의 디딤돌이라고 생각합니다. 개발자와 테스트에 대한 우려를 분리하는 데 도움이됩니다. 프레임 워크가 들어오고 나올 때 유연성을 허용하는 설계시 안심할 수 있습니다.

IoC (CW 또는 Ninject 등)가 목표로 삼고있는 목표를 달성하는 가장 좋은 방법은 개발자가 개발시 잘못된 이해의 정면에 놓을 필요가없는 정치 # 1 및 # 2를 제거하는 것입니다. 이 두 가지 솔루션이 IoC와 관련이없는 것 같습니까? 그들은 :)


3

Castle Windsor is Dependency Injection container.이 기능을 사용하면 새 키워드를 사용하지 않고도 종속성을 주입하고 사용할 수 있습니다. 예를 들어 리포지토리 또는 서비스를 작성했으며 여러 곳에서 사용하려는 경우 먼저 서비스 / 리포지토리를 등록해야하며 필요한 장소에 주입 한 후 사용할 수 있습니다. 캐슬 윈저를 배우기 위해 따라 간 아래 튜토리얼을 살펴볼 수 있습니다.

링크 .

그것이 도움이되기를 바랍니다.


1

간단히 말해서 작업을 수행하기 위해 몇 가지 간단한 구성 값이 필요한 클래스에 코드가 묻혀 있다고 상상해보십시오. 즉, 해당 클래스의 인스턴스를 만드는 모든 것이 해당 종속성을 가져와야하므로 일반적으로 인스턴스가 생성되는 위치로 약간의 구성을 전달하는 방식으로 많은 클래스를 리팩터링해야합니다.

따라서 많은 클래스가 불필요하게 변경되면 구성 값을 하나의 큰 구성 클래스로 묶습니다.

IoC를 통해 클래스는 번거 로움없이 모든 의존성을 얻을 수 있으며 인스턴스의 수명을보다 명확하게 관리 할 수 ​​있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.