2010-02-25 4 views
1

추상 클래스를 '호스트'와 '플러그인'간의 계약 객체로 사용할 수 있습니까? 플러그인은 계약을 상속받습니다 (우리는 어댑터라고 부릅니다). 프레임 워크의 모든 참가자가 MarshalByRefObject (MBRO)을 상속해야한다는 것도 이해하고 있습니다. 그래서, 이것은 우리가 무슨 생각입니다 -플러그인 프레임 워크에서 추상 클래스를 계약으로 사용

호스트 :

class Host : MarshalByRefObject 
{ 
} 

계약 :

public abstract class PluginAdapter : MarshalByRefObject 
{ 
} 

플러그인 :

class myPlugin : PluginAdapter 
{ 
} 

세 개 모두 별도의 asm에 있습니다. 우리의 호스트는 각 플러그인에 대한 새로운 응용 프로그램 도메인을 만들 것이며, 다음과 같이 PluginAdapter가 생성됩니다

{ 
    ObjectHandle instHandle = Activator.CreateInstance(
    newDomain, data.Assembly.FullName, data.EntryPoint.FullName); 

    PluginAdapter adapter = (PluginAdapter)instHandle.Unwrap(); 
} 

편집 : datamyPlugin의 구체적인 유형입니다.

이 프레임 워크 구현이 효과가 있는지 궁금해하고있었습니다. 우리는 플러그인 파생을위한 인터페이스 (IPlugin)와 계약으로서의 구체적인 클래스를 사용하는 기사를 보았습니다. 그 기사들은 또한 추상 클래스가 사용될 수 있다고 말하지만, 그 구현 예는 없다. 계약이 구체적인 수업이어야합니까?

편집 :

계약 :

public interface IPlugIn 
{ 
    // do stuff 
} 

플러그인 :

public class PlugIn : MarshalByRefObject, IPlugIn 
{ 
} 
리처드 Blewett하여이 예에서 - - C# Reflection 그는 훨씬 단순한 구현을 사용

이제 추상 클래스를 계약으로 사용하는 경우 플러그인은 계약과 MBRO를 상속받을 수 없습니다. 그러면 확장 가능한 플러그인 프레임 워크를위한 최상의 구현이됩니다. 처음에 리모트를 구현해야합니까? 처음에는 싱글 머신 작업을 위해 개발 중입니까? 이 프로젝트는 인터넷을 통해 가능하면 네트워크를 통해 배포 될 것으로 예상됩니다. 우리는 플러그인 프레임 워크의 기본을 완전히 이해하고 운영하기 위해 Tcp를 아직 구현하지 않았습니다.

단일 컴퓨터에서 루프백을 사용하여 Tcp Remoting을 구현하는 것이 합리적입니까?

답변

6

추상 클래스가 더 나은 선택입니다. 그 이유는 인터페이스가 버전 화하기가 더 어렵 기 때문입니다. This blog post은 기본 클래스를 사용하지 않는 경우에 발생할 수있는 문제를 설명합니다. 이 규칙은 플러그인에만 적용되는 것이 아니라 btw입니다.

디자인 정보 ...

플러그인은 MBRO를 확장하지 않아야합니다. 플러그인 이벤트 처리를 포함하여 모든 호출을 플러그인에 마샬링하려면 호스트 (MBRO를 확장해야 함)를 사용해야합니다. 플러그인을 사용하고 프록시를 사용하려고 시도 할 경우 의도하지 않게 플러그인 DLL을 기본 appdomain에로드하는 것이 매우 쉽습니다.

예를 들어 플러그 인이 해당 메서드 중 하나에 대해 IEnumerable을 반환하면 플러그인 어셈블리에 정의 된 IEnumerable 구현을 반환 할 수 있습니다. MBRO를 확장하지 않으면 기본 appdomain이 플러그인 어셈블리를로드해야합니다.


나는 여기에 응용 프로그램 도메인을 다루는 세 가지 프로젝트를 업로드 한 :

http://cid-f8be9de57b85cc35.skydrive.live.com/self.aspx/Public/NET%20AppDomain%20Tests/appdomaintests.zip

하나의 응용 프로그램 도메인에서 콜백을 사용하고, 두 번째는 상호 응용 프로그램 도메인 이벤트 처리, 그리고 세 번째는 플러그인 예입니다 .

플러그인 예제에서 응용 프로그램은 플러그인 인터페이스 (모범 사례가 아닌 데모)와 플러그인 호스트를 정의합니다. 앱은 디스크에서 원시 플러그인 어셈블리를로드하고로드 된 플러그인 호스트 프록시를 통해 플러그인 appdomain으로 전달합니다. 그런 다음 플러그인 호스트는 플러그인을 인스턴스화하여 사용합니다. 그러나 호스트가 플러그인 어셈블리에 정의 된 유형을 응용 프로그램 appdomain으로 다시 반환하면 플러그인 어셈블리가 주 응용 프로그램 도메인에로드되어 전체 플러그인 작업이 무의미 해집니다.

피할 수있는 가장 좋은 방법은 serializable로 표시되지 않고 MBRO를 확장하지 않는 플러그인에 대한 추상 기본 클래스를 제공하고 플러그인 도메인의 경계를 통해 다시 정의한 프리미티브 또는 봉인 된 유형 만 가져 오는 것입니다.

참고 : 프로젝트는 모두 4.0 RC입니다. 그들을 실행하려면이 이상이 필요합니다. 그렇지 않으면 프로젝트 파일을 손으로 편집하거나 b2 또는 2008에서 실행할 수 있도록 다시 빌드해야합니다.

+0

'myPlugin'이 MBRO를 확장하지 않는다면, 우리는 경험 한 것에서부터, 우리는 그것이 직렬화 가능하지 않다는 예외를 얻습니다. 우리는'[Serializable]이 플러그인의 appdomain이 아닌 Host의 appdomain에서 클래스를 효과적으로 인스턴스화한다는 것을 알고 있습니다. – IAbstract

+0

@ dboarman 플러그인 도메인에서 응용 프로그램 도메인으로 플러그인을 가져 오는 중입니다. 내가 말했듯이, 이런 일이 생기면 너 자신을 위험에 빠뜨리고있다.자신의 앱 도메인에 플러그인을 유지하려는 경우 앱 도메인간에 통신되는 모든 유형을 제어해야합니다. 플러그인 호스트는 플러그인 도메인 내에 존재해야합니다. 되돌려 보내는 유형은 사용자가 제공 한 유형이어야합니다. 그렇게하지 않으면 도메인에서 플러그인 어셈블리를로드하는 위험이 있습니다. 이러한 "직렬화 가능하지 않은"예외는 양호합니다. 그들은 당신이 뭔가 잘못하고 있다고 말합니다 - 코드를 가져 오는 것입니다. – Will

+0

도메인을 관리하는 @dboarman은 까다로운 프로세스이며 올바르게 진행하려면 시간과 노력이 필요합니다. 가장 쉬운 방법은 플러그인 도메인에서 언랩하는 단일 유형을 작성하는 것입니다. 이 유형은 플러그인로드 및 관리를 담당합니다. 플러그인 도메인에서 전송 된 것은 사용자가 제공하는 유형이어야하며 플러그인이 자체 버전을 반환하지 못하도록 봉쇄해야합니다. 시스템의 소규모 프로토 타입을 작성하는 것은 이러한 기술을 개선하는 데 매우 유용 할 수 있습니다. 나는 그것을했고 많이 배웠다. – Will

0

콘크리트 유형이 myPlugin 인 경우 (다른 appdomain에서 어셈블리를로드하는 데 문제가 있지만 다른 문제가 아닌 한)이 작업이 수행되지 않는 이유는 없습니다.

+0

예 ... 'data.EntryPoint.FullName'이 구체적인 유형'myPlugin'을 참조하고 있음을 명확히하기 위해 편집이 추가되었습니다. – IAbstract

2

"data.EntryPoint.FullName"이 전체 유형 이름 인 경우 위 코드가 작동해야합니다.

그러나이 유형을 자체 AppDomain에 격리하려는 경우 여기에서주의해야합니다.data.Assembly을 수행하면 AppDomain에 어셈블리를 가져 와서 실행중인 AppDomain에로드 할 수있게합니다. ...

+0

추상 계약에 정의 된 이벤트를 추가 할 때까지 '대부분'작동하는 것처럼 보입니다. 호스트가 이벤트를 구독하면 어셈블리를 확인할 수없는 TargetInvocationException이 발생합니다. 그래서 다른 문제가 필요할 수 있습니다. 우리는 단지 "이 일을 할 것인가"라는 기본적인 질문으로 시작하고 싶었습니다 ... – IAbstract

1

Addins를 수행하기 위해 .NET에 내장 된 확장 성 프레임 워크 인 MAF (the Managed Addin Framework)을 살펴볼 수 있습니다. 그것은 MEF (Managed Extensibility Framework)과 비슷하지만 (오래된), 다른 것들 중에서도 자신의 앱 도메인에 플러그인을 유지하는 데까지 더 많은 옵션이 있습니다.

+0

MAF와 Mono를 살펴 봤습니다. 우리는 Windows 시스템보다 광범위한 기반을 목표로 삼고 있습니다. – IAbstract

관련 문제