계약, 뷰 및 어댑터

이 항목에서는 추가 기능 파이프라인의 양쪽에 공통된 세그먼트인 뷰와 어댑터 및 호스트와 추가 기능에 모두 사용되는 계약에 대해 자세히 설명합니다. 다음 그림에서는 추가 기능 파이프라인의 세그먼트를 보여 줍니다.

추가 기능 파이프라인

추가 기능 파이프라인 모델

코드 예제를 보려면 연습: 호스트 변경으로 인한 이전 버전과의 호환성 활성화연습: 호스트와 추가 기능 간의 컬렉션 전달을 참조하십시오.

계약

통신 파이프라인을 개발하는 첫 번째 단계는 IContract 인터페이스에서 파생되어야 하는 계약을 정의하는 것입니다. 호스트와 추가 기능이 개별 응용 프로그램 도메인에서 로드되면 파이프라인의 추가 기능측과 파이프라인의 호스트측 사이에 격리 경계가 만들어집니다. 계약은 격리 경계에서의 형식 통신에 사용되는 프로토콜을 정의하는 비버전 관리 인터페이스입니다. 추가 기능 모델에서는 계약을 사용하여 격리 경계를 통해 통신함으로써 형식의 호스트 구현과 추가 기능 구현이 경계 외부로 누출되어 버전 관리 문제가 발생하는 것을 방지합니다.

응용 프로그램 도메인에서 통신해야 하는 개체는 원격화할 수 있어야 합니다. 원격화할 수 있는 개체에 대한 자세한 내용은 Remotable and Nonremotable Objects를 참조하십시오.

ContractBase 클래스는 IContract 멤버의 기본 구현을 제공합니다. 계약 인터페이스에서도 이 클래스를 상속할 수 있습니다.

계약 요구 사항

계약은 해당 계약 내에 표시된 모든 형식이 안전하며, 버전 관리가 가능하고, 호스트와 추가 기능 사이의 격리 경계를 넘어 전달할 수 있도록 하기 위해 일련의 요구 사항을 따라야 합니다.

계약은 IContract에서 상속되어야 하며 다음과 같은 형식만 사용해야 합니다.

  • IContract에서 파생되는 다른 계약

  • 기본 데이터 형식(정수 및 부울 형식)

  • 계약 어셈블리에 정의된 serialize 가능한 형식

  • Mscorlib.dll에 정의된 serialize 가능한 형식(예: Int32DateTime)

  • serialize 가능한 봉인 참조 형식. 예를 들어 String 개체는 serialize 가능한 봉인 참조 형식이므로 격리 경계를 통해 전달할 수 있습니다.

  • 계약 또는 Mscorlib.dll에 정의된 열거형

  • AddInToken 개체

  • 앞에 나열된 모든 형식의 배열(계약 배열 제외)

개체 컬렉션을 전달하려면 List<T>ArrayList 컬렉션 같은 제네릭 IList<T> 인터페이스를 구현하는 형식을 사용합니다. 격리 경계를 통해 이러한 컬렉션을 전달하려면 컬렉션을 일시적으로 IListContract<T> 인터페이스로 변환합니다. 연습: 호스트와 추가 기능 간의 컬렉션 전달 항목에서는 컬렉션을 전달하는 방법에 대해 설명합니다.

파이프라인을 생성하려면 AddInContractAttribute 특성을 사용하여 추가 기능을 나타내는 계약을 식별해야 합니다.

파이프라인 개발의 다음 단계는 파이프라인의 양쪽에 대해 뷰 및 어댑터 세그먼트를 만드는 것입니다. 이러한 세그먼트는 호스트 응용 프로그램과 추가 기능에 각 개체 모델 뷰를 제공하고 해당 뷰와 계약 간에 변환을 지원하는 어댑터를 제공합니다.

호스트의 추가 기능 뷰와 추가 기능의 호스트 뷰는 상대 뷰 및 호스트와 추가 기능 사이에 흐르는 형식의 뷰를 나타내는 추상 클래스 또는 인터페이스가 포함된 어셈블리입니다. 뷰는 뷰 간의 통신에 사용되는 계약에 의존하지 않습니다. 또한 뷰는 추가 기능 및 호스트를 상대의 각 구현과 구분하므로 호스트 또는 추가 기능에 영향을 주지 않고 어댑터와 계약을 변경할 수 있습니다.

파이프라인을 생성하려면 AddInBaseAttribute 특성을 사용하여 추가 기능이 구현하거나 상속하는 추가 기능 뷰의 형식을 식별해야 하는데, 이를 추가 기능 기본 형식이라고 합니다. 호스트 뷰는 FindAddIns 메서드에 전달되므로 검색 기능을 위한 특성이 필요하지 않습니다.

어댑터

추가 기능측 어댑터와 호스트측 어댑터는 뷰와 계약을 서로 변환하는 데 사용되는 어댑터가 포함된 어셈블리입니다. 여기서 "측"이라는 용어는 파이프라인에서 어댑터가 있는 쪽을 나타냅니다. 어댑터는 호출 방향에 따라 뷰에서 계약으로 변환하거나 그 반대로 변환합니다. 양방향 호출이 있는 경우(즉, 호스트에서는 추가 기능으로 호출하고 추가 기능에서는 호스트로 호출함) 파이프라인에 한쪽씩 두 개의 어댑터가 만들어집니다. 따라서 어댑터에는 다음과 같은 두 가지 유형이 있습니다.

  • 뷰에서 계약으로 변환하는 어댑터

    뷰에서 계약으로 변환하는 어댑터 어셈블리의 클래스입니다. 이 클래스는 해당 생성자로 전달된 뷰로 호출하여 계약을 구현하고 경계에서 계약으로 마샬링됩니다. 또한 이 클래스는 ContractBase를 상속하고 계약을 구현해야 합니다.

  • 계약에서 뷰로 변환하는 어댑터

    계약에서 뷰로 변환하는 어댑터 어셈블리의 클래스입니다. 이 클래스는 뷰가 인터페이스인지 아니면 추상 기본 형식인지에 따라 변환하는 뷰 세그먼트를 구현하거나 상속하고, 어댑터의 생성자에 전달되는 계약을 호출하여 뷰의 멤버를 구현합니다.

  • 파이프라인을 생성하려면 AddInAdapterAttribute 특성을 적용하여 추가 기능측 어댑터 클래스를 식별하고 HostAdapterAttribute 특성을 적용하여 호스트측 어댑터 클래스를 식별해야 합니다.

  • 어댑터는 public일 필요가 없습니다.

참고 항목

개념

파이프라인 개발 요구 사항

파이프라인 개발