2012-08-22 1 views
2

클래스 라이브러리에 플러그인 아키텍처를 노출 한 상황에서 다른 사람들이 내가 만든 인터페이스를 구현할 수있게하고 싶습니다. 클래스에 의해 커스텀 구현이 사용되도록 (듯이)합니다.플러그인 아키텍처가있는 경우 API 반환 값에 대한 읽기 전용 액세스 보장

저는이를 수행하기 위해 의존성 주입 (구체적으로 생성자 주입)을 사용하고 있습니다.

이 내가이 개 충돌하는 목표와 응용 프로그램을 설계 할 시도한 사실을 제외하고 잘 작동 : 반환 값을 수정할 수 없습니다해야 API의

  • 소비자; 내가 다른 어셈블리에서, 그것을
  • 플러그인을 수정할 수있는 소비자 없도록하기 위해 세터에 internal 등을 사용하여 사용자 지정 읽기 전용 컬렉션과 객체를 생성 한, 이 내부 메서드와 속성
에 액세스 할 수 있어야합니다 하지 일반 소비자에게 internal 플러그인 어셈블리 ( InternalsVisibleTo 또는 유사한 통해) 액세스,하지만 을 부여하는 (그 문제에 대한 또는 C#을) 내 API에 대한 방법이 없기 때문에

이 두 가지 목표는 상충된다.


대표적인 예

한다고 가정 우리는 세 가지 어셈블리를 가지고있다. 내 수업 (Class), 플러그인 어셈블리 (Plugin) 및 소비자 어셈블리 (Consumer).

인터페이스, IReturnValue은 API의 반환 값 (Class 어셈블리의 일부 메서드 또는 클래스)을 지정합니다. 문제는 다음과 같습니다. 의 주어진 인스턴스에서 읽기 전용 (internal) 속성과 인덱서를 설정할 수 있도록하려면 Plugin을 입력해야하지만이 작업을 수행하려면 Consumer 코드가 필요하지 않습니다.

플러그인 시스템이 작동 중이므로 InternalsVisibleTo에 어떤 어셈블리를 허용할지 미리 알 수 없습니다.


이러한 상황에서 은 반환 유형을 수정하는 소비자에 대해 정말로 신경 써야합니까? 그들이하는 것이 자신의 잘못 인 것 같습니다. 그리고 나는이 문제를 해결하기위한 적절한 해결책을 생각할 수 없다.

+0

문제를 설명하는 샘플 코드가 대단히 도움이 될 것이라고 생각합니다. 나는 내가 이해하고 있는지 확신하지 못한다. –

+0

이제 막 작업 중이 었습니다. 나도 알아, 나 혼란 두 :/ –

답변

3

내가 이미 내 의견에서 말했듯이, 나는 당신의 질문을 정확하게 이해하지 못했습니다. 당신은 소비자에 의해 구현 자에 의해 사용되는 클래스 A가

:

는이 같은 질문을 이해했다. 소비자는 에만 데이터를 가져와 데이터를 가져와야하며, 구현자는 을 추가로 설정하여 데이터를 설정할 수 있어야합니다.

이 경우 나는 소비자에게 읽기 액세스만으로 구현 된 인터페이스와 구현 자에 대한 읽기/쓰기 액세스로 모델링 된 하나의 인터페이스를 만들 것입니다.

질문 업데이트 후 업데이트 :
소비자 용 읽기 전용 인터페이스가 이미 있습니다 : IReturnValue이 목적으로 사용해야합니다.

이제해야 할 일은 API의 필요에 따라 쓰기 전용이거나 읽기/쓰기 인 인터페이스를 만드는 것입니다.

+0

나는이 접근 방식에 동의합니다. 컴파일러 가시성 플래그를 보안 메커니즘과 혼동하는 경우가 있습니다. 그것들은 소비자들에게 힌트로서 존재합니다. 실제 내부 상태를 수정하고 싶다면 리플렉션을 통해 C# 가시성 제약 조건을 얻을 수 있습니다. 따라서 소비자에게 읽기/쓰기 인터페이스에 액세스함으로써 그들이하는 일을 알 수 있습니다. – dkackman

+0

감사합니다. 이것이 내가 필요한 것처럼 보입니다. –

+0

업데이트 내용 : 내부적으로 (그리고 플러그인을 통해), IReturnValueInternal과 같은 것을 사용하여 읽기/쓰기임을 나타낼 수 있습니다. 그런 다음 소비자에게 'IReturnValue'를 반환합니다. –