2009-11-18 1 views
5

플러그인을로드하는 문제가 해결되면 (.NET에서 MEF까지), 해결할 다음 단계는 그와의 통신입니다. 간단한 방법은 인터페이스를 구현하고 플러그인 구현을 사용하는 것입니다.하지만 플러그인이 애플리케이션의 작동 방식을 확장해야 할 때도 있고 확장 점이 많이 필요할 수도 있습니다.확장/플러그인 통신을위한 아키텍처

내 질문은 그 확장 포인트를 다루는 방법에 관한 것입니다. 나는 그것을하는 다른 방법을 보았으나 각각의 장점과 단점에 대해 잘 모르겠다. 그리고 이것을 성취 할 더 좋은 방법이 더 있다면 :

  • 이벤트 : 모든 물건에 정적 이벤트 추가 우리는 "확장 가능"하게 만들고 싶습니다. 예를 들어, User 클래스에 대한 사용자 지정 유효성 검사를 추가하려면 OnValidation 정적 이벤트 처리기를 추가하고 플러그인이 생성 될 때 플러그 인에서 이벤트를 이벤트에 추가 할 수 있습니다.
  • 메시지 : 버스와 메시지가 있습니다. 플러그인은 특정 메시지를 구독하고 다른 클래스가 해당 메시지를 게시 할 때 처리 할 수 ​​있습니다. 메시지에는 플러그인이 작동 할 수있는 컨텍스트가 있어야합니다. 유효성 검사의 경우 논리 계층은 UserValidation 메시지를 게시하고 메시지가 수신되면 플러그인이 작동합니다.
  • 인터페이스 : 호스트 응용 프로그램은 특정 인터페이스를 구현하는 모든 플러그인을 호출하고 현재 작업의 컨텍스트를 제공합니다. 유효성 검사의 경우, 플러그인은 유효성 검사 (개체 컨텍스트) 메서드를 사용하여 IValidator 또는 IUserValidator를 구현할 수 있습니다.

노출 된 접근 방법 중 하나를 사용해 본 적이 있습니까? 어느 것이 당신에게 가장 잘 맞았습니까?

당신이 물어보기 전에, 우리의 응용 프로그램은 클라이언트 특정 콘텐츠 중심의 웹 응용 프로그램을 빌드 할 수있는 확장 가능한 핵심 (사용자, rola 및 콘텐츠 관리)입니다. 모든 것이 ASP.NET MVC를 기반으로합니다.

답변

2

디자인 결정의 핵심은 플러그인이 서로 얼마나 다른지에 대한 명확한 그림을 분석하여 얻는 것입니다.

예. 정적 이벤트를 처리 할 때 각 이벤트를 토큰, enum, object 등의 형식으로 정의해야 할 것입니다. 각 플러그인에 대한 새로운 이벤트 세트를 정의하는 것은 자연스럽게 전체 설계, 특히 느슨한 결합 및 재사용.

플러그인이 매우 다른 경우 이러한 경우에는 플러그인이 가입 할 수있는 통신 교환의 도메인/카테고리를 소개 할 수 있기 때문에 버스/메시징 아키텍처가 도움이 될 수 있습니다. 나는. 이벤트 및 메시지의 범위는 특정 관심 도메인에있을 수 있습니다. 여기에서는 특정 카테고리 내의 통신이 여전히 정적 이벤트를 사용할 수 있으므로이 두 가지 대안은 상호 배타적이지 않습니다.

플러그인에 의해 구현 된 직접 인터페이스는 내 경험상 플러그인 아키텍처의 가장 엄격한 접근 방식입니다. 플러그인 인터페이스를 확장하는 것은 대개 플러그인과 공급자 모두에서 코드 수정을 의미합니다. 당신은 당신의 애플리케이션이 꽤 오랫동안 살 수 있다는 것을 알 수있는 견고한 일반 인터페이스가 필요합니다.

두 가지 측면으로 그것을 분해하여 당신이 디자인에 대처하기가 더 쉬울 수도 있습니다 - 통신 채널프로토콜. 정적 이벤트 처리는 프로토콜 문제이며 버스 메시징 및 직접 인터페이스는 채널 문제입니다.

일반적으로 프로토콜을 처음부터 올바르게 디자인하는 것이 가장 어렵다고 말합니다. 일반 또는 특정 선을 그릴 수있는 확실한 느낌이 없기 때문입니다.

편집 : Lars는 그의 의견에서 중요한 점을 지적했습니다 - 플랫폼이 예외를 지원하면 직접 인터페이스를 사용할 때 많은 오류 처리를 중앙 집중화 할 수 있으며 플러그인이 일반적인 오류를 처리하지 않아도되는 것을 방지 할 수 있습니다. (예 : "플러그인로드 오류"또는 "파일 열기 실패"). 그러나 플러그인을 추가 할 때마다 인터페이스를 유지해야하는 경우 이러한 이점이 사라질 수 있습니다. 최악의 경우는 처음부터 지원해야 할 것이 무엇인지 알지 못했기 때문에 인터페이스가 일관성없이 시작되는 경우입니다. 상당량의 플러그인이 이미 잉태되었을 때 전체 인터페이스 디자인을 리팩토링하는 것은 쉬운 일이 아닙니다.

+0

인터페이스는 아마도 내 접근 방식 일 것입니다.하지만 응용 프로그램에 따라 다르지만 플러그인 요구 사항이 있습니다. 하지만 플러그인을 작성하는 것은 매우 깨끗한 방법이며 플러그인에서 예외를 쉽게 분리 할 수도 있습니다. –

0

나는 옵저버 패턴과 함께 갈 것입니다. GOF에서 :

객체 사이에 일대 다 의존성 을 수 있도록 정의 하나 명 개체 변경은 모든 부양 통보 자동 업데이트됩니다 명시합니다.

또한 publish-subscribe로도 알려져 있습니다. 예제에서 case 2와 가장 일치하는 것이 좋습니다.

+0

IMHO 옵저버 패턴은이 문제에서 한 단계 위입니다. 나는. 그가 제시하는 모든 대안은 그 패턴에 들어 맞을 것이다. 당면한 이슈는 관찰자 패턴의 구현 특정 결정과 관련이 있습니다. – sharkin

+0

다시 읽고 더 많은 소화를 할 때, 아마도 당신은 아마도 R.A. – Martin