캐슬 윈저 란 무엇이며 왜 신경 써야합니까? 해결했습니다. 2001 년부터

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

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



답변

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

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

여기에서 시작하십시오 : 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 코드로 결함을 줄일 수 있습니다.


답변

Mark Seemann은 IOC의 일부인 DI (Dependency Injection)에 관한 훌륭한 책을 썼습니다. 또한 여러 컨테이너를 비교합니다. 이 책을 충분히 추천 할 수 없습니다. 이 책의 이름은 “.Net의 의존성 주입” https://www.manning.com/books/dependency-injection-in-dot-net입니다.


답변

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

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


답변

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

링크 .

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


답변

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

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

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


답변