![](http://blog.powerumc.kr/upload/Image/NET/NET-Framework/MEF7/capture7.jpg)
예를 들어 아래와 같은 Export 구성 요소 중 어떻게 EmailMessageSender 로 Say() 를 호출할 것인가가 문제인 것이죠.
[Export(typeof(IMessageSender))]
public class EmailMessageSender : IMessageSender
{
public void Say()
{
Console.WriteLine("Import EmailMessageSender");
}
}
[Export(typeof(IMessageSender))]
public class PhoneMessageSneder : IMessageSender
{
public void Say()
{
Console.WriteLine("Import PhoneMessageSneder");
}
}
[Export(typeof(IMessageSender))]
public class SmsMessageSender : IMessageSender
{
public void Say()
{
Console.WriteLine("Import SmsMessageSender");
}
} |
왜 ExportMetadata 클래스는 sealed 로 선언이 되었나요?
일반적으로 sealed 로 클래스를 봉인할 경우 리플랙션의 성능이 향상됩니다.
|
[Export(typeof(IMessageSender))]
[ExportMetadata("SenderType", "Email")]
[ExportMetadata("Logging", true)]
public class EmailMessageSender : IMessageSender
{
public void Say()
{
Console.WriteLine("Import EmailMessageSender");
}
}
[Export(typeof(IMessageSender))]
[ExportMetadata("SenderType", "Phone")]
public class PhoneMessageSneder : IMessageSender
{
public void Say()
{
Console.WriteLine("Import PhoneMessageSneder");
}
}
[Export(typeof(IMessageSender))]
[ExportMetadata("SenderType", "Sms")]
public class SmsMessageSender : IMessageSender
{
public void Say()
{
Console.WriteLine("Import SmsMessageSender");
}
}
|
MEF Preview 5 에서는 ImportRequiredMetadataAttribute 클래스가 제거되었습니다.
MEF Preview 4 에서는 선언적인 방법으로 ImportRequiredMetadataAttribute 를 통해 Metadata 를 질의할 수 있었으나, MEF Preview 5 에서는 ImportRequiredMetadataAttribute 클래스가 제거되었습니다.
아마도 추측으로는 ImportRequiredMetadataAttribute 를 선언 시에 여러 개의 구성 요소가 검색될 경우 Exception 이 발생하는데, Exception 을 최소화 하고자 제거가 된 것 같습니다.
혹시 Statically 한 방법으로 ImportRequiredMetadataAttribute 에 대응되는 클래스를 아시면 저에게 알려주세요. |
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
namespace MetadataSample
{
class Program
{
[Import(typeof(IMessageSender))]
ExportCollection<IMessageSender> Sender { get; set; }
static void Main(string[] args)
{
Program program = new Program();
program.Run();
foreach (var export in program.Sender)
{
if ((string)export.Metadata["SenderType"] == "Email")
export.GetExportedObject().Say();
if (export.Metadata.ContainsKey("Logging") &&
(bool)export.Metadata["Logging"] == true)
Console.WriteLine("Logged success");
}
}
void Run()
{
var catalog = new AggregateCatalog(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
var container = new CompositionContainer(catalog);
var batch = new CompositionBatch();
batch.AddPart(this);
container.Compose(batch);
}
public interface IMessageSender
{
void Say();
}
[Export(typeof(IMessageSender))]
[ExportMetadata("SenderType", "Email")]
[ExportMetadata("Logging", true)]
public class EmailMessageSender : IMessageSender
{
public void Say()
{
Console.WriteLine("Import EmailMessageSender");
}
}
[Export(typeof(IMessageSender))]
[ExportMetadata("SenderType", "Phone")]
public class PhoneMessageSneder : IMessageSender
{
public void Say()
{
Console.WriteLine("Import PhoneMessageSneder");
}
}
[Export(typeof(IMessageSender))]
[ExportMetadata("SenderType", "Sms")]
public class SmsMessageSender : IMessageSender
{
public void Say()
{
Console.WriteLine("Import SmsMessageSender");
}
}
}
}
|
![](http://blog.powerumc.kr/upload/Image/NET/NET-Framework/MEF7/capture8.jpg)
'Managed Extensibility Framework' 카테고리의 다른 글
[MEF] 9. Recomposition (1) | 2009.04.19 |
---|---|
[MEF] 8. Strongly Typed Metadata (0) | 2009.04.16 |
[MEF] 6. Lazy Exports (0) | 2009.04.13 |
[MEF] 5. Catalog 사용 (0) | 2009.04.09 |
[MEF] 4. Import 선언 (0) | 2009.04.07 |