플러그 형 소프트웨어를 구축하는 방법은 무엇입니까?


20

어떤 종류의 응용 프로그램이 있고 사용자가 플러그인을 작성할 수있게하려면 응용 프로그램을 어떻게 설계해야합니까?

무엇을 고려해야합니까, 이것에 대한 디자인 패턴은 무엇입니까?


관찰자, 중재자, 명령 광고 책임 체인과 같은 패턴이
떠오름

3
@Mchl : 댓글이 아닌 답변으로 답변을 게시하십시오.
S.Lott


나는 그것에 대해 충분히 상세하지 않다고 느낀다
Mchl

@Mchl : "충분히 상세하지 않다"? 그렇다면 왜 전혀 언급하지 않습니까? 분명히 답입니다. 답변을 답변으로 게시하십시오.
S.Lott

답변:


13

플랫폼에 따라 다르지만 명심해야 할 몇 가지 일반적인 사항

버전 관리 응용 프로그램을 업데이트하면 이전 플러그인이 모두 사용되지 않는 문제 (Firefox 문제)

격리 플러그인이 원하는 것을 할 수 있습니까? 당신은 항상 그들을 믿습니까? 또는 일종의 샌드 박스에서 실행하고 권한을 요청해야합니까?

업데이트 플러그인 업데이트를 어떻게 처리합니까?

보안 플러그인 작성자를 보장하고, 스푸핑 또는 사용자가 악성 코드를 설치하도록 속이는 것을 방지하는 방법 일반적으로 일종의 코드 서명으로 해결됩니다.

직렬화 어떤 종류의 격리를 사용하는 경우 종종 다른 스레드 또는 프로세스간에 정보를 직렬화해야합니다. 가장 효율적인 방법은 무엇입니까?

확장 성 어떤 측면을 확장해야합니까? API가 다루기 어려워지지 않으면 서 플러그인의 잠재력을 어떻게 극대화 할 수 있습니까?

플러그인에 대한 타사 개발자를 대상으로하는 경우 가장 중요한 것은 내 경험에 따르면 플러그인 API와 클래스가 나머지 응용 프로그램과 완전히 다른 것으로보고 개발하기 쉽도록 만드는 것입니다 가능한 한. 기본 앱의 아키텍처가 플러그인으로 "배달"하는 것이 매우 쉬워서 플러그인 작성자가 필요한 것보다 훨씬 더 많은 것을 배워야합니다. 플러그인 작성자가 원하는 인터페이스와 경험에 대해 쉽게 생각할 수 있습니다.

또 다른 좋은 사고 방식은 "플러그인은이 모든 것을 코드로 수행하는 것이 아니라"플러그인은이 정보를 제공해야합니다. "라고 생각하는 것입니다. 이렇게하면 응용 프로그램이 필요한 정보를 소비하고 단순화 할 실제 처리를 수행 할 수 있습니다. 플러그인.

또한 일반적으로 코드 대신 설명적인 접근 방식 (xml과 같은 메타 데이터)을 수행 할 때마다 메타 데이터를보다 쉽게 ​​전송, 버전 관리, 배포, 보호 할 수 있고 타사에서 더 쉽게 구성 할 수 있으므로 큰 이점이 있습니다.


1
+1이 질문에 직접 대답하지는 않지만 이러한 점을 명심해야합니다.
Adriano Carneiro

누군가가 실제 확장 성 메커니즘을 개발하기 전에 이러한 문제가 다루어지고 있다고 생각합니다.
Gus

9

.NET에서 확장 성을 위해 MEF를 사용하는 방법에 대한 이 코드 프로젝트 기사를 작성했습니다 . 좋은 소개입니다.

SharpDevelop의 Add-in Architecture , Mono.AddinsSystem.AddIn 과 같은 .NET을위한 다른 확장 성 프레임 워크가 있습니다 .

Java의 경우 Eclipse 플러그인 아키텍처가 있습니다.

일반적인 패턴은 다음과 같습니다.

  • 호스트와 확장 사이의 계약 (일반적으로 인터페이스)을 정의합니다
  • 나가서 설치된 확장을 찾는 검색 메커니즘이 필요합니다.
  • 확장을 동적으로로드하고 호스트가이를 인식하도록해야합니다.

실제로 그것은 의존성 주입 및 전략 패턴과 많은 것을 공유합니다.


+1 MEF와 System.AddIn은 모두보기에 좋습니다. 당신이 그것들을 사용하지 않더라도 둘 다 좋은 개념을 보여줍니다.
RationalGeek

@jkohlhepp-동의합니다. 또한 SharpDevelop 아키텍처에 대해 자세히 설명하고 오픈 소스 (MEF, btw) 및 잘 설계되어 있기 때문에 SharpDevelop 아키텍처에 대해 자세히 살펴볼 것을 제안합니다.
Scott Whitlock

3

플러그인에 대한 인터페이스 만 제공하면됩니다.

최소한 Activate-Methode (엔트리 포인트)를 포함해야하지만 Initialize 등을 원할 것입니다.

그리고 메뉴 항목을 등록하는 등 레지스트리와 같은 방식으로 호스트 응용 프로그램과 통신 할 수 있어야합니다. 따라서 플러그인에 대해 변경 가능하거나 확장 가능한 것들에 대한 레지스트리가 제공되어야합니다.

또한 호스트 응용 프로그램의 데이터 및 객체에 대한 액세스 가능한 스토리지가 있어야 플러그인이 루틴을 호출 할 수 있습니다. Unity와 같은 DI 컨테이너를 사용하고 플러그인에서 액세스 할 수 있도록하면 필요한 서비스를 해결할 수 있습니다.

Event-Aggregator는 아마도 좋은 아이디어 일 것이므로 플러그인은 이벤트를 throw하고 다른 플러그인과 호스트 응용 프로그램의 이벤트에 분리 된 방식으로 반응 할 수 있습니다. 당신은 분명히 하나를 원합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.