2012-11-01 4 views
0

백만 가지 방법의 클래스가있는 API를 다루고 있습니다.이 메소드가하는 일을 알고 있으며, 웹 서비스의 프록시 일뿐입니다.프로그래밍 방식으로 클래스에 메서드를 추가 하시겠습니까?

API는 내부적으로 적절한 메소드 이름을 호출하는 리플렉션을 사용하여 이러한 프록시 메소드를 호출합니다 (왜 이렇게했는지 묻지 않음).

API에 의해 구현되지 않은 웹 서비스의 메소드가 있으며 이러한 프록시 메소드를 동적으로 주입해야합니다.

내 질문은입니다. 어떻게 기존 메서드 (확장 메서드가 아닌)에 메서드를 추가 할 수 있습니까?

나는 Reflection.Emit으로이를 수행 할 수 있지만 MSIL을 모른다.
어쨌든 API 클래스와 동일한 기본 클래스를 상속하는 다른 클래스를 만들었으므로이 클래스를 메서드를 구현하여 API 클래스에 메서드를 복사 할 수있는 방법이 있습니다. 같은 클래스를 참조하는 기본 클래스의 메서드 만 호출합니다.

+2

동적으로 "주입"해야하는 이유는 무엇입니까? 사람들이 외부 API에 서비스를 추가하고 다시 컴파일하지 않고 서비스를 호출 할 수 있기를 정말로 원하십니까? –

+0

@KirkWoll, 그들이 제공하는 .NET API는 웹 API의 일부만을 다루고 있습니다. 다른 웹 파트를 숨기려면 몇 가지 메소드를 추가하고 싶습니다.하지만 모든 호출은이 클래스의 메소드를 리플렉션으로 호출하는 메시지를 통해 진행됩니다. 그것이 유일한 선택 인 것 같아요. 그렇지 않으면 전체 API를 다시 작성해야합니다. 훨씬 더 많은 노력이 필요합니다. 그래서 네, 그 방법을 주입하고 싶습니다. 또한, (속성 클래스에 대한) 내 어셈블리를 확인하고 등록해야하는 '모든 메소드 등록'기능을 만들겠습니다. 제가 말했듯이, 그것들은 단지 프록시 메소드 일 뿐이며, 그것을 구축하는 로봇을 만드는 것은 쉽습니다. – Shimmy

+4

컴파일 타임에 * full * API를 알았을 때 ** 동적으로 ** 메소드를 추가하려는 이유를 아직도 이해하지 못합니다. 그건 내 말이 맞지 않아. –

답변

1

현실적으로 원하는 방식으로 기존 클래스를 수정할 방법이 없습니다. Reflection.Emit를 사용하더라도 API가 특정 유형을 호출하고 런타임 중에 유형 정의를 수정할 수 없기 때문에 원하는 것을 수행하지 않습니다. Reflection.Emit을 사용하여 수행 할 수있는 작업은 프록시에서 상속되는 유형을 정의하는 것이지만 상속 된 유형을로드하는 API를 가져 오는 것은 종속성 주입 프레임 워크를 사용하지 않는 한 불가능할 것입니다.

이 작업을 수행하는 유일한 방법은 들어가서 디 컴파일 및 재 컴파일을 사용하여 dll의 바이트 코드를 수정하는 것입니다. 이것은 Postsharp가 AOP를 수행하는 방법이지만, imo, 나는 결코 다른 이유로 이것을하지 않을 것입니다.

이 코드 나 라이브러리에 액세스 할 수 있다면 문제 해결에 도움이 될 수 있습니다.

+0

Lemme은 API의 프록시 메소드가 호출되는 방식을 알려주고 API는 리플렉션을 사용하여 X 유형의 메소드 X를 호출합니다. 따라서 메소드를 추가 할 방법이 없다고 말하는 것입니까? 그게 유일한 장애물이기 때문에 노력할만한 가치가 있다고 생각합니다. API의 디 컴파일 된 코드를 살펴 보았습니다. 그렇지 않으면 이미 수많은 클래스로 만들어진 전체 API를 다시 작성해야합니다. – Shimmy

+0

X를 입력하는 메소드를 추가한다는 것은 불행히도 대부분의 (모든?) 정적 유형 언어에서 가능하지 않습니다. 그렇지 않으면 Javascript와 Ruby와 같은 동적 유형의 언어에서 원숭이 - 패치로 알려져 있습니다. –

+0

확인. 방법을 찾은 것 같아요, 그 프록시 클래스를 상속하고 API 대신 내 프록시 클래스를 사용하도록 지시 할 수 있습니다. 지금 확인하고 있습니다. 어쨌든 입력 해 주셔서 감사합니다! – Shimmy

0

리플렉션을 사용하는 것처럼 보입니다. 두통을 피하고 Extention Methods에서 논리를 감싸는 것처럼 보입니다 (특별히 말하지는 않았지만).

이 경우 확장 메서드가 나쁜 생각 인 이유나 API 개발자가 노출하지 않은 이유에 대해 자세히 알고 싶으면 더 유용한 정보를 찾을 수 있습니다.

+0

정확히 이것은 확장 메서드가 설계된 것입니다. +1 – Neolisk

+0

아니요. API는 호출 할 메소드를 결정하는 사람이며이 결정은 호출 이름 (문자열)에 의해 만들어 지므로 내가 보는 유일한 방법은 내 질문에 설명 된대로 메소드를 추가하는 것입니다. 확장 메소드가 작동하지 않습니다. . – Shimmy

+0

네거티브 인 API는 개발자가 액세스 할 수 있어야한다고 느낀 기능에 대한 액세스 권한을 제공합니다. 다른 것은 API가 아닙니다. – rfmodulator

관련 문제