[Export(typeof(IMessageSender))]
[ExportMetadata("SenderType", "Email")]
[ExportMetadata("Logging", true)]
public class EmailMessageSender : IMessageSender
{
public void Say()
{
Console.WriteLine("Import EmailMessageSender");
}
} |
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
public class MessageSenderTypeAttribute : Attribute
{
public MessageSenderTransport Transport { get; set; }
public bool IsSecure { get; set; }
public MessageSenderTypeAttribute() { }
public MessageSenderTypeAttribute(MessageSenderTransport transport)
: this(transport, false)
{
}
public MessageSenderTypeAttribute(MessageSenderTransport transport, bool isSecure)
{
this.Transport = transport;
this.IsSecure = IsSecure;
}
}
public enum MessageSenderTransport
{
Email,
Phone,
Sms
} |
[Export(typeof(IMessageSender))]
[MessageSenderType(MessageSenderTransport.Email)]
public class EmailMessageSender : IMessageSender
{
public void Say()
{
Console.WriteLine("Import EmailMessageSender");
}
}
[Export(typeof(IMessageSender))]
[MessageSenderType(MessageSenderTransport.Phone, true)]
public class PhoneMessageSneder : IMessageSender
{
public void Say()
{
Console.WriteLine("Import PhoneMessageSneder");
}
}
[Export(typeof(IMessageSender))]
[MessageSenderType(Transport=MessageSenderTransport.Sms, IsSecure=true)]
public class SmsMessageSender : IMessageSender
{
public void Say()
{
Console.WriteLine("Import SmsMessageSender");
}
} |
foreach (var export in program.Sender)
{
if ((MessageSenderTransport)export.Metadata["Transport"] == MessageSenderTransport.Sms)
{
export.GetExportedObject().Say();
if ((bool)export.Metadata["IsSecure"] == true)
{
Console.WriteLine("Security message");
}
}
} |
[그림1] Strongly Typed 질의 결과
public interface IMessageSenderTypeAttribute
{
bool IsSecure { get; }
MessageSenderTransport Transport { get; }
} |
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
public class MessageSenderTypeAttribute : Attribute, IMessageSenderTypeAttribute
{
public MessageSenderTransport Transport { get; set; }
public bool IsSecure { get; set; }
public MessageSenderTypeAttribute() { }
public MessageSenderTypeAttribute(MessageSenderTransport transport)
: this(transport, false)
{
}
public MessageSenderTypeAttribute(MessageSenderTransport transport, bool isSecure)
{
this.Transport = transport;
this.IsSecure = IsSecure;
}
} |
[Import(typeof(IMessageSender))]
ExportCollection<IMessageSender, IMessageSenderTypeAttribute> Sender { get; set; }
static void Main(string[] args)
{
Program program = new Program();
program.Run();
foreach (var export in program.Sender)
{
if (export.MetadataView.Transport == MessageSenderTransport.Email)
{
export.GetExportedObject().Say();
}
}
} |
'Managed Extensibility Framework' 카테고리의 다른 글
[MEF] 10. Querying the CompositionContainer (0) | 2009.05.18 |
---|---|
[MEF] 9. Recomposition (1) | 2009.04.19 |
[MEF] 7. Exports and Metadata (0) | 2009.04.16 |
[MEF] 6. Lazy Exports (0) | 2009.04.13 |
[MEF] 5. Catalog 사용 (0) | 2009.04.09 |