2011-01-29 3 views
0

내가 MEF, MAF, 유니티와 손실을 조금 해요 ...C# .NET 4.0 양식 플러그인 관리자

이 질문의 WinForm 응용 프로그램의 아키텍처에 관한 것입니다.

나는 메인 폼과 다른 폼들을 포함하는 메인 프로젝트를 가지고있다;

내가 모듈화을 포함하고 싶기 때문에, 나는 Plugin System을 사용하려고 생각하고있다. 내가하고 싶은 무엇

개방 그들이 호출 될 때까지 내가 에게이를 처분하고 싶은

다음

각 플러그인의 DLL 주 응용 프로그램 버튼, 도구 모음과 각을 참조하는 열입니다 ... .

하지만 모든 플러그인을 메모리에 보관하고 싶지는 않습니다. 좋은 아키텍처 모델을 얻으려면.

.NET에 대한 그래서 첫째 : 합니까 후에 .NET 메모리에있는 DLL 플러그인으로 만 참조을 유지하거나 모든 플러그인 코드?

MEF를 사용하여 LAZY 컬렉션을 가져오고 싶습니다.하지만 먼저 버튼 정보를 얻기 위해 인스턴스화해야합니다. 내가 null에 가져 오기 컬렉션을 설정하고 다시 compose() 기능을 미사일하면 그래서

초 문제는 플러그인이로드 될 또는로드 (게으른)로 호출 할 때까지 기다릴 것인가?

+0

질문을 수정 해 주시겠습니까? 조금 혼란스럽고 일반적입니다. – tomfanning

+0

더 좋습니까? 정말 유감스럽지 않아서 미안해. – guillaume

답변

2

그런 다음 호출 될 때까지 처리하고 싶습니다.

가져온 개체를 검사 한 다음 던져 버리는 대신 가져 오기 metadata을 검사해야합니다. Lazy<IFoo,IFooMetadata> 또는 Lazy<IFoo,Dictionary<string,object>>을 가져 와서이 메타 데이터를 가져올 수 있습니다. ExportMetadata 속성을 사용하여이 메타 데이터를 내보내기에 추가 할 수 있습니다.

그래서 .NET에 대해 : dotNet은 메모리 또는 모든 플러그인 코드의 dll 플러그인에 대한 참조 만 유지합니까?

어셈블리가로드되면 전체 AppDomain을 언로드하지 않으면 메모리에 남아 있습니다.

또한 .NET 4.0에는 ComposablePartCatalog의 기본 구현이 없으며 해당 어셈블리를로드하지 않고도 쿼리 할 수 ​​있습니다. 그러나 메타 데이터를 어셈블리 외부에 저장하면 이론적으로 이와 같은 작업을 수행 할 수 있습니다. MEF code on codeplex에는 그러한 구현의 샘플이 있습니다.

나는 반드시로드되는 어셈블리를 방지 할 수 없습니다 게으른 수입을 사용하여 가져 오기

의 LAZY의 컬렉션 MEF를 사용하여 생각 해요.Lazy<IFoo> 개체에 대한 참조가있는 경우 최소한 IFoo을 포함하는 어셈블리를로드해야합니다. 위에서 설명한대로 내 보낸 IFoo 구현을 포함하는 어셈블리도로드됩니다.

Lazy를 사용하면 일부 생성자의 호출 만 연기되므로 잘하면 응용 프로그램을 빠르게 시작할 수 있습니다.