문제

저는 회사 내부 프로젝트를 진행 중이며 프로젝트의 일부는 XML 파일의 다양한 "작업"을 나중에 실행할 작업 모음으로 구문 분석 할 수있는 것입니다.

각 태스크 유형에는 다양한 관련 필드가 있기 때문에 각 유형의 태스크를 별도의 클래스로 표현하는 것이 가장 좋습니다.

이를 위해 추상 기본 클래스를 구성했습니다. 라코 디스

각 작업은이 기본 클래스에서 상속되었으며, 전달 된 XmlElement에서 자신을 생성하고 XmlElement로 다시 직렬화하는 데 필요한 코드를 포함했습니다.

기본 예 : 라코 디스

파서는 다음과 유사한 코드를 사용하여 작업 컬렉션을 만듭니다. 라코 디스

이 모든 것이 훌륭하게 작동하며 각 작업에 대해 개별 클래스를 갖는 구조를 유지하면서 기본 클래스를 사용하여 작업을 전달할 수 있습니다.

그러나 TaskFactory.CreateTask에 대한 내 코드가 마음에 들지 않습니다. 이 메서드는 XmlElement를 수락 한 다음 적절한 Task 클래스의 인스턴스를 반환합니다. 라코 디스

XMLElement를 구문 분석해야하기 때문에 인스턴스화 할 자식 클래스를 선택하기 위해 거대한 (실제 코드에서 10-15 개의 경우) 스위치를 사용하고 있습니다. 이 방법을 정리하기 위해 여기서 할 수있는 일종의 다형성 트릭이 있기를 바랍니다.

조언이 있습니까?

도움이 되었습니까?

해결책

나는 이것을하기 위해 반사를 사용합니다. 코드를 추가하지 않고도 기본적으로 확장되는 공장을 만들 수 있습니다.

"using System.Reflection"이 있는지 확인하고 인스턴스화 메서드에 다음 코드를 배치합니다. 라코 디스

또 다른 관찰은이 메서드를 정적으로 만들고 Task 클래스에서 끊을 수 있다는 것입니다. 그러면 TaskFactory를 새로 만들 필요가 없으며 유지 관리를 위해 움직이는 부분을 스스로 저장할 수 있습니다..

다른 팁

각 클래스의 "프로토 타입"인스턴스를 만들고 XML에서 예상하는 문자열을 키로 사용하여 팩토리 내부의 해시 테이블에 넣습니다.

CreateTask는 올바른 Prototype 객체를 찾습니다. 해시 테이블에서 get ()을 사용합니다.

그런 다음 LoadFromXML을 호출합니다.

해시 테이블에 클래스를 미리로드해야합니다.

자동화를 원한다면 ...

공장에서 정적 등록 메서드를 호출하여 클래스를 "자체 등록"하도록 만들 수 있습니다.

태스크 하위 클래스의 정적 블록에 등록 (생성자 포함) 호출을 넣습니다. 그런 다음 정적 블록을 실행하기 위해 클래스를 "멘션"하기 만하면됩니다.

태스크 하위 클래스의 정적 배열은이를 "멘션"하는 데 충분합니다. 또는 반성을 사용하여 수업을 언급하십시오.

Dependency Injection에 대해 어떻게 생각하십니까?나는 Ninject를 사용하고 그것의 컨텍스트 바인딩 지원은이 상황에 완벽 할 것입니다. 블로그 게시물 상황에 맞게 사용하는 방법에 대한 좋은 자료가 될 것입니다.

@jholland <인용구>

항상 다음과 같이 할 수 있기 때문에 Type enum이 필요하지 않다고 생각합니다.

열거 형?

해키 느낌이 있음을 인정합니다.처음에는 반사가 더럽다고 느껴지지만 일단 짐승을 길 들이면 할 수있는 일을 즐길 수 있습니다.(재귀를 기억하십시오. 더럽게 느껴지지만 좋습니다.)

비결은 메타 데이터 (이 경우 xml에서 제공되는 문자열)를 분석하고이를 런타임 동작으로 바꾸는 것입니다.그것이 바로 반성이 최고입니다.

BTW : is 연산자이자 반영이기도합니다.

http://en.wikipedia.org/wiki/Reflection_(computer_science)# 사용

@Tim, 저는 여러분의 접근 방식과 ChanChans의 단순화 된 버전을 사용하게되었습니다. 코드는 다음과 같습니다. 라코 디스

@ 찬찬

나는 성찰의 아이디어를 좋아하지만 동시에 저는 항상 성찰을 사용하는 것을 부끄러워했습니다.더 쉬워야하는 문제를 해결하는 것은 항상 나를 "해킹"이라고 생각합니다.나는 그 접근 방식을 고려한 후 동일한 양의 코드 냄새에 대해 switch 문이 더 빠를 것이라고 생각했습니다.

항상 다음과 같이 할 수 있기 때문에 Type enum이 필요하지 않다고 생각하게하셨습니다. 라코 디스

어쩌면 GoF Design Patterns 책을 다시 열어야하는데 올바른 클래스를 다형 적으로 인스턴스화하는 방법이 있다고 생각했습니다.

<인용구>

열거 형?

내 추상 클래스에서 Type 속성과 열거 형을 참조했습니다.

그럼 반성!다른 사람이 참여할 시간을주기 위해 약 30 분 후에 답변을 수락 한 것으로 표시하겠습니다. 재미있는 주제입니다.

개설 해 주셔서 감사합니다. 불평하지 않겠습니다.재미있는 주제입니다. 다형 적으로 인스턴스화 할 수 있으면 좋겠습니다.
루비 (및 우수한 메타 프로그래밍)조차도이를 위해 반사 메커니즘을 사용해야합니다.

@ 데일

저는 nInject를 면밀히 조사하지 않았지만, 의존성 주입에 대한 높은 수준의 이해를 바탕으로 ChanChans의 제안과 동일한 결과를 얻을 수있을 것이라고 생각합니다.

여기에서 필요한 일회성 상황에서는 링크 할 추가 라이브러리를 가지고 한 곳만 호출하는 것보다 손으로 만든 리플렉션 코드를 사용하는 것이 더 나은 방법이라고 생각합니다 ...

하지만 nInject가 여기에서 제공하는 이점을 이해하지 못할 수도 있습니다.

일부 프레임 워크는 필요한 경우 리플렉션에 의존 할 수 있지만 대부분의 경우 부트 스트 래퍼를 사용하여 객체의 인스턴스가 필요할 때 수행 할 작업을 설정합니다.이것은 일반적으로 일반 사전에 저장됩니다.최근까지 Ninject를 사용하기 시작했을 때까지 내 것을 사용했습니다.

Ninject에서 가장 마음에 드는 점은 반사를 사용해야 할 때 사용하지 않는다는 것입니다.대신 .NET의 코드 생성 기능을 활용하여 매우 빠릅니다.사용중인 맥락에서 반영이 더 빠르다고 생각되면 그렇게 설정할 수도 있습니다.

현재 필요한 것이 과잉 일 수도 있다는 것을 알고 있지만, 의존성 주입에 대해 지적하고 미래에 대한 생각을위한 음식을 제공하고 싶었습니다.강의를 보려면 dojo 를 방문하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top