2009-05-08 4 views
11

마지막으로 여기에있는 사람들의 도움으로 플러그인 아키텍처의 작업 솔루션을 구축했지만 지금은 새로운 문제가 발생합니다.자체 app.config를 사용하는 플러그인

내 호스팅 응용 프로그램은 실행중인 어셈블리 (Windows 서비스)의 일부 기본값에 대해 app.config 파일을 사용합니다.

각 플러그인은 호스트가 플러그인 설정을 인식해서는 안되기 때문에 별도의 플러그인 설정 파일에서 자체 설정을로드 할 수 있어야합니다. 플러그인 프로젝트에서 app.config 파일을 추가 (일부 설정 및 연결 문자열 포함)하여 Properties.Settings 클래스를 인스턴스화하고 플러그인 코드의 속성을 사용할 수있게했습니다.

플러그인의 app.config (plugin.dll.config로 빌드 됨)의 설정을 변경할 때 문제가 발생합니다. 디자인 타임 설정을 사용하는 플러그인 자체에서 이러한 변경 사항을 볼 수 없습니다. .

생성 된 Properties.Settings 클래스가 작동하도록 각 플러그인에서 app.config 설정을로드하는 방법이 있습니까? 플러그인에 app.config 기반 설정 파일을로드하는 또 다른 방법이 있습니까? IPlugin 인터페이스에 LoadConfiguration 메서드를 추가하여 각 플러그인이 자체 설정을로드 할 계획입니다.

답변

2

ConfigurationManager.OpenMappedExeConfiguration 같은 도움말을 보시겠습니까? 특정 파일의 값을 읽는 Configuration 객체를 만들 수 있습니다.

+0

실제로 시도했지만 어떻게 든 작동하지 않는 것 같습니다. –

+0

이 작업을 계속 유지하는 또 다른 문제는 Configuration 인스턴스가 있지만 여전히 생성 된 Properties.Settings 클래스가 작동하지 않는다는 것입니다. –

3

당신은 app.config의 아키텍처를 사용하고 있습니다. 실행 파일 당 하나의 app.config 파일을 얻습니다 (DLL이 아닌 EXE). 실행 파일이 시작되고 AppDomain이 생성 된 다음 MyApp.exe.config가로드됩니다. Visual Studio에서 app.config 개체를 모두 추가 할 수 있지만 DLL에서는 무시됩니다. 필자가 원하는 것은 수동으로 dll.config에서 XML을 복사하여 응용 프로그램 수준 app.config에 붙여 넣는 것입니다. (TeamBuild 또는 일부를 사용하여 자동화하는 방법이있을 것이라고 확신합니다.) 재정의 된 값은 Properties.Settings 클래스에서 사용할 수 있습니다.

+0

네,하지만 질문은 애플리케이션이 플러그인 설정을 인식해서는 안된다는 것을 분명히합니다. – ChrisF

+0

사실, 어떻게 든 플러그인의 설정을 런타임에 기본 app.config 설정 파일에 동적으로 삽입 할 수 있다면 만족할 것입니다. 문제는 여기에 거의 모든 SQL Server 데이터베이스에서 작동하므로 plugins의 app.config 파일의 connectionstring 설정 장이 필요합니다. –

+0

각 플러그인이 자체 AppDomain에서 생성 된 경우 (일반적으로 다른 게시물에서 볼 수있는 좋은 아이디어이므로) 새 AppContext에 대해 다른 설정 파일을로드하도록 설득 할 수 있습니다. –

2

필자는 IConfigManager 유형 플러그인을 만들고 사용하는 것을 선호합니다. 이 작업은 구성 저장 방법을 추상화하는 것입니다. 의존성 주입을 통해 인스턴스를 수신합니다. 이렇게하면 IConfigManager 구현이 네트워크, db 또는 다른 소스에서 여러 .config 파일의 설정을로드 할 수 있습니다. 또한 사용자, 기계 및/또는 응용 프로그램을 기반으로하는 기본값을 제공하는 데 사용합니다.이 값은 사용자가 재정의 할 수 있습니다. 배경색, 글꼴 등을 포함 할 수 있습니다.

이 방법의 다른 장점은 설정을 모든 플러그인에서 일관되게 유지할 수 있다는 것입니다. 즉, 플러그인을 신경 쓸 필요없이 플러그인 설정이 투명하게 변경 될 수 있습니다. config를 다른 것으로 설정) 그리고 마지막으로 IConfigManager를 단위 테스트 중에 조롱하여 다른 상황을 시뮬레이션 할 수 있습니다.

도움이 되었기를 바랍니다.

+0

나는이 접근에 흥미가있다. 예제 또는 예제 링크를 게시 할 수 있습니까? – HitLikeAHammer

+0

안녕하세요 릭, 나는이 주석에 많은 예제를 집어 넣을 수 있을지 확신하지 못합니다. 이 답변에 특정한 것에 대한 링크가 없습니다. 블로그가 있다면 블로그 게시물을 쓸 수 있습니다. 내가 당신이 더 많이 알고 싶다고 말한 부분이 있었습니까? 나는 어딘가에 블로그를 만들 수 있고 이것에 대해 글을 쓸 수 있는지 알게 될 것이지만 빨리되지는 않을 것이다. 건배. –

1

저는 Erik의 동료입니다. 그가 앞으로 몇 주간 잘 지내기 때문에 나는이 문제에 관해 더 자세히 설명 할 것이다.

우리 플러그인에서 우리는 WCF 서비스 클라이언트의 여러 인스턴스를 사용합니다. 이 서비스의 깔끔한 점은 동작, servicetype, 보안 등을 구성하는 데 사용할 수있는 app.config 섹션이 있다는 것입니다.

이제 플러그인을로드 할 때 이러한 섹션이 config 및 따라서 올바른 엔드 포인트를 찾을 수 없습니다. 물론 코드로 설정할 수는 있지만, 필요할 때마다 다른 설정 옵션을 설정할 수있는 능력이 있습니다. 예를 들어 ws-security를 ​​구현하려고 할 수 있습니다.

그래서 우리는 이러한 설정을로드하여 플러그인이 각각의 설정을 읽을 수 있도록해야합니다. 우리는 물론 모든 configs를 하나에 병합 할 수 있지만, 그런 종류의 플러그인 설치와 함께 configs를 관리해야하기 때문에 "그냥 플러그인"방법을 제거합니다.

프로젝트의 하위 디렉토리에있는 모든 구성과 '마스터'구성을 병합하고 .exe.config 파일을 해당 구성으로 바꿀 작은 도구를 만들려고했습니다. 나는 그것이 효과가있을 것이라고 생각하지만, .NET이 더 나은 옵션을 제공하지 않을지 궁금해하고있다. 여러 AppDomains는 플러그인이 상호 작용 (제공자/소비자 모델)해야하기 때문에 효과가있는 것이 아니며이 문제로 인해 원격으로 전환하고 싶지 않습니다.

업데이트 : 대부분의 문제는 ConfigurationManager를 사용하여 appSettings를 읽는 기존 구성을 열어 수정했습니다. WCF 클라이언트의 경우 여기 당신은 서버와 클라이언트 엔드 포인트/바인딩 구성을로드 할 수 http://weblogs.asp.net/cibrax/archive/2007/10/19/loading-the-wcf-configuration-from-different-files-on-the-client-side.aspx

+0

주 app.config/web.config에서 외부 .config 파일을 참조 할 수 있다는 사실을 알고 있습니까? 그렇게하면 별도의 파일에 플러그인 설정을 유지하고 기본 설정에 대한 참조 만 추가 할 수 있습니다. 어쨌든 플러그인을 등록해야하므로 큰 문제는 아 닙니다. – Aaronaught

1

당신은 외부 파일을 가리 키도록 설정 ConfigSource를 사용하는 주요 설정 파일에 다음 읽기 그 자체가없는 ConfigurationSection에서 각 플러그를 만들 수 있습니다. (자세한 내용은 link을 참조하십시오.)

기본 app.config 파일에서 플러그인 구성 정보를 완전히 벗어나지는 않지만 최소한 플러그인 별 설정은 별도의 파일에 있습니다.

0

나는 보통 호스트가 플러그인의 설정으로 내부에서 처리하는 전용 XML 파일을 생성하여 전체 app.config 혼란을 피하는 것을 선호한다. XML은 다음과 같이 보일 것입니다 : 클래스가 를 ISerializable가 구현하는 경우

<root> 
    <Settings> 
     Here's where anything specific to the app goes. 
    </Settings> 
    <plugins> 
     <plugin type="mylibrary.myclass"> 
      Here I let the plugin serialize itself however it wants to. 
     </plugin> 
    </plugins> 
</root> 

가 호스팅 응용 프로그램은 다음 유형 속성과 시험에서 플러그인을 생성; 그럴 경우 플러그인은 자체를 비 직렬화합니다. 플러그인의 인라인 설정을 앱의 인라인으로 유지하는 것은 다소 무서운 일이지만, 플러그인의 Xstream 하위 문자열을 새 XmlReader으로로드하면 플러그인에서 Xml에서 너무 멀리 읽지 못하는 것에 대해 걱정할 필요가 없습니다. 끈.