-
[MEF] 10. Querying the CompositionContainer
Managed Extensibility Framework 2009. 5. 18. 10:00 Posted by POWERUMCQuerying the CompositionContainerCompositionContainer 의 Exported 구성 요소를 취득하기 위해서는 컨테이너에 하나의 구성 요소만이 존재해야 합니다. 쿼리(Query) 를 통해 이러한 객체들이 여러 개 존재할 경우 MEF 는 예외를 발생하게 됩니다.바로 아래와 같은 경우이죠.l 하나의 인스턴스를 요청할 때, 인스턴스를 찾지 못했을 경우l 하나의 인스턴스를 요청할 때, 인스턴스가 여러 개일 경우GetExportedObject일반적으로 ExportAttribute 에 인자가 전달되지 않은 경우는 클래스의 타입이 키 값이 되어, 아래와 같이 구성 요소를 취득할 수 있습니다.class Program{static void Main(string[] args){var container = new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly()));var export = container.GetExportedObject<Export1>();export.Say();Console.ReadKey();}}[Export]class Export1{public void Say(){Console.WriteLine("Export1 Say..");}}만약, ExportAttribute 에 Contract Name 이 선언이 될 경우는 클래스의 타입 정보와 Contract Name 이 일치해야 구성요소를 취득할 수 있습니다.class Program{static void Main(string[] args){var container = new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly()));var export = container.GetExportedObject<Export2>("export2");export.Say();Console.ReadKey();}}[Export("export2")]public class Export2{public void Say(){Console.WriteLine("Export2 Say..");}}GetExport만약 여러 개의 구성 요소의 인스턴스가 필요하다면 GetExport 메서드를 통해 Export 의 구성 정보를 가져오면 됩니다.var exports = container.GetExport<Export1>();exports.GetExportedObject().Say();필요하다면 ExportAttribute 의 Contract Name 으로 질의(Query) 할 수 있습니다.var exports = container.GetExport<Export2>("export2");exports.GetExportedObject().Say();아쉽게도 MEF Preview 4 까지 지원하던 C# 3.0 의 Expression 을 통해 질의하는 방법은 MEF Preview 5 이후 없어진 것이 아쉽네요.GetExportedObjectOrDefault일반적으로 MEF 에서는 질의(Query) 결과가 없을 경우 예외를 발생하게 되는데, GetExportedObjectOrDefault 메서드를 통해 결과가 없을 경우 Null 값으로 대체할 수 있습니다.var obj = container.GetExportedObjectOrDefault<Export1>("A");if( obj != null )obj.Say();
https://vsts2010.tistory.com/68
https://learn.microsoft.com/en-us/dotnet/framework/mef/#imports-and-exports-with-attributes
728x90'C# > WPF' 카테고리의 다른 글
[WPF] ObservableCollection<> Binding (0) 2023.11.02 [WPF] Pre-build event/post-build event (0) 2023.10.17 [WPF] gRPC ChatService Example (0) 2023.10.11 [WPF] Module Include Assembly .dll Copy to Working Directory (0) 2023.08.30 [WPF] Project Nuget Packaging (0) 2023.08.23 댓글