1

저는 자바에서 피코 컨테이너를 사용하여 제가 설계 한 미니 크래프트 플러그인 프레임 워크 용 DI를 수행했습니다.피코 컨테이너로 멀티 데코레이터 설정하기

플러그인에는 인터페이스에 정의 된 이벤트 리스너 메소드가 있으며 인터페이스 당 하나의 메소드입니다.

플레이어가 서버에 참여하고 나가는 동안 특정 클래스가 이벤트를 원하면이 인터페이스는 두 개의 특정 인터페이스를 구현합니다. 이 경우 IPlayerLoginEvent 및 IPlayerQuitEvent.

다음 프레임 워크에는 각 유형의 이벤트 인터페이스를 생성자 주입 인수로 사용하는 클래스가 있습니다.

이 컨테이너 클래스는 craftbukkit 서버 소프트웨어가 호출하는 @Listener로 태그가 지정됩니다.

래퍼 클래스는 craftbukkit에서 프레임 워크 관련 클래스로 보내는 데이터를 래핑하므로 최소한 이론 상 서버 무의미한 플러그인을 작성할 수 있습니다.

작은 예 :

플러그인 AwesomePlugin이 IPlayerLoginEvent 및 IPlayerQuitEvent를 구현하는 클래스의 PlayerHandler 있습니다. 프레임 워크는 PlayerHandler를 생성자 인수로 전달하여 "PlayerLogin"및 "PlayerQuit"클래스의 각 인스턴스를 생성해야합니다. PlayerLogin 및 PlayerQuit 인스턴스는 CraftBukkit에 이벤트 리스너로 등록됩니다.

이 현재 피코를 사용하여 구현하는 방법은 여기에 볼 수 있습니다

:

https://github.com/Runsafe/Framework/blob/master/src/no/runsafe/framework/event/EventEngine.java#L32

그 코드가 끔찍한 보이나요 나는이 시나리오에 대한 더 우아한 해결책을 찾을 수 없어, 그래서 지금 귀하의 지침을 외칩니다.

+0

아키텍처에 대한 정보를 추가하는 것이 좋습니다. 코드를 깊이 파고 들지 않고 진행되는 일을 따라하기가 어렵습니다. – Torious

+0

좋아요, 시도 할게요 .. –

답변

1

글쎄, 나는 당신이 질문하는 것을 이해하지 못한다. 그러나 나는 어떤 피코 이벤트 패턴을 설명 할 수있다.

우선 이벤트는 컨테이너 중심이므로 이벤트를 연결하는 데 피코를 사용하지 마십시오. 모든 이벤트 소비자가 컨테이너에 추가됩니다. 각 소비자는 적어도 하나의 이벤트 obj를 얻기위한 메소드를 구현해야합니다. 전달되는 일반 Event 클래스가있는 단일 인터페이스를 가질 수도 있고 다른 이벤트 유형에 대해 많은 인터페이스를 가질 수도 있습니다.

따라서 컨테이너에있는 소비자 목록 (또는 여러 이벤트 유형에 대한 여러 목록)이 있습니다. 일부 이벤트 브로드 캐스터 개체에 주입 된 소비자 목록을 가질 수 있습니다 (컨테이너 작성 당 한 번만 수행되고 브로드 캐스터는 이벤트를 어떻게 든 어딘가에서 가져온 다음 목록을 반복하고 관련 이벤트 처리기 메서드를 호출하거나 컨테이너 사용자 정의주기 호출을 호출합니다 (런타임에 추가 된 소비자를 트리거 할 때 호출하는 작업은 컨테이너 자체에서 수행됩니다)

경우에 따라 각 이벤트에 대해 새 이벤트 컨테이너를 만들고 이벤트 obj 및 모든 관련 소비자를 추가 할 수도 있습니다.

와플 프레임 워크에는 피코 컨테이너 저글링, 이벤트 처리 등의 멋진 사례가 포함되어 있습니다.

+0

바로 뒤에 따라 가지 않았기 때문에 답변을 더 자세하게 읽을 것입니다.하지만 지금은 여기에 몇 가지 추가 정보가 있습니다. CraftBukkit 서버에 이벤트 수신기를 등록하기 위해 호출하는 메서드가 있습니다. 이것들은 @EventHandler로 태그가 지정되어야하고 특정 이벤트 유형을 인수로 취하는 메소드가 있어야합니다. 따라서 사용되지 않을 플러그인에서 이벤트 리스너를 만들고 싶지 않습니다. 따라서 필요한 리스너를 만드는 매핑 코드를 작성했습니다. 내일이 스레드로 돌아 오겠지 만 지금은 잠이 필요합니다. –

+0

오케이 이것을 잠시 생각한 후에, 나는 당신이 말하는 것을 이해하고 그것은 좋은 시스템처럼 들리 네요. 불행히도, 내 사건을 완전히 해결하지는 못할 것입니다. 성능상의 이유로 프레임 워크 용으로 작성된 모든 플러그인이 모든 서버 이벤트를 수신하는 것을 원하지 않습니다. 인터페이스를 구현하는 여러 구성 요소를 등록하는 방법이 있고 해당 인터페이스의 모든 구현 인스턴스를 가져 와서 종속 관계가없는 인스턴스를 무시하면 문제가 해결됩니다. –

+0

'누락 된 deps'는 무엇을 의미합니까? ? 다른 인터페이스를 사용하여 이벤트 흐름을 분할하거나 인터페이스 (반사 기반 수명주기, 피코 기능)없이 다른 메소드를 사용하거나 이벤트 리스너를위한 단일 빈 마커 인터페이스를 가질 수 있으며 자신의 반사 기반 조회를 사용하여 이벤트를 전달할 수 있습니다. 실제로 많은 옵션이 있습니다. – xeye