2013-06-27 2 views
1

저는 지난 몇 년 동안 윈저 사용자가 많았습니다. Fluent Registration API 이전에는 XML 등록과 AddComponent() 코드의 거대한 더미 사이를 토글했습니다. 우리는 유창한 등록 API 및 설치 프로그램을 꽤 오랫동안 사용해 왔습니다. 나는 다음과 같은 다양한 작품에서 인상을받은했습니다캐슬 윈저 및 다이내믹 배선

이 중단되도록 표시 한 경우 근처에 어떤 점에서 XML을 등록 방법은 호의에서 떨어졌다 그것은 나를 놀라게하지 않을

http://docs.castleproject.org/Windsor.XML-Registration-Reference.ashx

그건 미래.

질문 : 유창한 등록 API 및 설치 프로그램은 자동 배선 시나리오 (예 : 윈저에서 객체 그래프를 구성하는 방법을 알아 내려는 경우)에 원활하게 작동합니다. 자동 배선은 대부분의 IoC 사용 사례가 있지만 자동 배선이 불가능할 때는 어떻게해야합니까? 다시 말해서 저는 여러 서비스 구현을 가지고 있고 Windsor에게 객체 그래프의 일부분을 구성하는 방법을 알려줄 필요가 있습니다. 나는 XML 등록 접근 방식으로 여러 번 해왔지만 요즘에는 좀 더 선호되는 접근 방식이 있습니까? 미래의 불확실성으로 인해 XML 등록 방법을 사용하는 것을 주저합니다. 그러나 Windsor와 함께이 작업을 수행하는 방법을 알지 못합니다.

내이 사용하는 경우는 다음과 같습니다

  • 시스템 QA 테스트에서 구현을 교환 할 수 있어야합니다 (즉, 우리는 신용 국 API에 의존하지 않고 을 테스트 할 신용 확인 및 사기 검출 처리)
  • 시스템에있는 공급자 패턴. 배포시 다른 구현을 조건부로 해제하거나 해제해야하는 시스템입니다.

이 모든 것이 IoC에 매우 적합하며 모든 빌딩 블록을 제자리에두고 있지만 Windsor와 가장 미래를 보장하는 방법을 사용하고 싶습니다.

업데이트 :이 기능 토글 방식을 좋아하지만 , 나는 최근에이 전면에 매우 유용한 윈저 기능 발견 - Fallback Components합니다. 나중에이 문제를 우연히 발견 할 수있는 사람을 위해이 편집을 남겨두고 있습니다.

+0

모방하려는 xml 구성을 게시 할 수 있습니까? – Maciej

답변

1

DI 컨테이너를 XML로 완전히 구성하는 것은 오류가 발생하기 쉽고, 길고, 너무 고통 스럽습니다. XML 구성 가능성은 항상 코드 기반 구성으로 수행 할 수있는 작업의 하위 집합입니다. 코드는 항상 표현력이 뛰어납니다.

때때로 DI 구성은 배포 시간 구성에 따라 다르지만 필요한 노브의 수가 상당히 적기 때문에 구성 플래그를 사용하면 정규화 된 형식 이름으로 구성 파일을 오염시키는 것보다 훨씬 더 나은 방법 일 때가 있습니다.

또는 배치 시간에 변경하려는 DI 구성이 많은 경우 구성 파일에 배치 할 때 다르게하십시오. 다시 생각해보십시오. 어쨌든 변경 사항 중 많은 부분은 개발자가 테스트해야하므로 운영 팀의 누군가가이를 해결할 수있는 방법이 없습니다. 개발자가보고 확인하고 확인할 필요가있는 경우 프로젝트를 다시 컴파일하지 않아도되는 이점은 무엇입니까? 실제로 더 빨라요? 어쨌든 개발자는 여전히 응용 프로그램을 시작해야합니다.

유연성이 부족하고 사실 인터페이스 디자인이 잘못되었습니다 (xml은 유지 관리 및 운영 부서의 인터페이스입니다). BTW, 구성 파일을 변경하는 방법을 문서화해야하는 사람입니까? xml 파일의 중간에있는 정규화 된 형식 이름 목록을 설명하는 대신이 필드에 "false '를 쓰면 훨씬 쉽게 작성할 수 있습니다 ... "?

bool detectFraught = 
    ConfigurationManager.AppSettings["DetectFraud"] != "false"; 

container.Register(
    Component.For(typeof(IFraughtDetector)).ImplementedBy(
     detectFraught ? typeof(RealDectector) : typeof(FakeDetector)); 

구성 스위치는 이제 단순히 부울 플래그 얼마나 참조 : 여기

는 구성 스위치를 사용하는 방법에 대한 예입니다. 이렇게하면 구성 파일이 완전한 유형 이름 (맞춤법이 틀릴 수 있음) 대신 간단한 부울 스위치가되므로 구성 파일을 훨씬 더 유지 관리 할 수 ​​있습니다.

당연히 ["DetectFraud"] != "false"을 수행하는 것은 그다지 좋지 않지만 강력하게 형식화 된 구성 도우미를 작성하면 간단히 해결할 수 있습니다.

+1

스티븐 - 동의합니다. 이런 이유로 XML 설정을 싫어했지만 프레임 워크 레벨에서 뭔가를 찾고 있습니다. 현실은 도메인 별 문제이며 프레임 워크 대신 나에게 가장 잘 해결됩니다. 구성 파일에 등록을 이동하는 모든 복잡성을 갖기보다는 설치 프로그램을 조건부로로드하기 위해 매우 특정한 구성 스위치를 열면됩니다. 너무 단순 해 보입니다 - 왜 오늘 아침에 더 분명하지 않은지 확실하지 않습니다 :) 환호성. – kellyb

0

This answer도 도움이 될 수 있습니다. 런타임시 동적으로 구현을 제공 할 수 있습니다. 비록 당신이 그것을 동적으로 필요로하지 않는 것처럼 들리지만, 조금 덜 명확한 일이 벌어지고 있습니다.

+0

Andy - 예, 현재 선택기를 사용하고 있으며 이는 런타임 조건에서 매우 잘 작동합니다. 스티븐이 내 문제에 더 잘 부합한다고 말하는 것 같아. – kellyb

0

Windsor에서 XML 구성 지원을 폐기하거나 제거 할 계획이 없습니다.

예, 맞습니다. 많은 단점 때문에 선호되지 않습니다.

XML로 할 수있는 모든 작업은 코드로 수행 할 수 있습니다 (역수는 사실이 아닙니다).

XML은 모두 또는 일부가 아닙니다. XML로 등록하지 않고 예제로 제시 한 시나리오를 달성하는 데는 여러 가지 방법이 있습니다.

  • 기능은

내가 다른 프로젝트에서의 각을 사용했습니다 ... appSettings는 플래그에 따라

  • 다른 사용자의 installer
  • 조건부 컴파일하는 경우/다른
  • 을 전환 과거에.

  • 관련 문제