Language: C#
Repeatable MEF metadata
class Program { static void Main(string[] args) { var instance = new Program(); var cat = new AssemblyCatalog(typeof(Program).Assembly); var container = new CompositionContainer(cat); container.ComposeParts(instance); foreach (var plug in instance.Plugins) { foreach (var category in plug.Metadata.Categories) { Console.ForegroundColor = ConsoleColor.Yellow; Console.Write("{0}, ", category); Console.ResetColor(); } Console.WriteLine(string.Empty); plug.Value.Write(); } Console.ReadLine(); } [ImportMany] public Lazy<IPlug, IMetadataView>[] Plugins { get; private set; } } public enum Category { Travel, Game, City, News } //[InheritedExport] // do not use inherited export (for some reason it don't working well with metadata) public interface IPlug { void Write(); } public interface IMetadataView { Category[] Categories { get; } } [MetadataAttribute] [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public class CategoryAttribute : Attribute { public CategoryAttribute(Category category) { Categories = category; } public Category Categories { get; private set; } } [Export(typeof(IPlug))] [ExportMetadata("Categories", Category.Travel, IsMultiple = true)] // using untyped metadata considered as bad practice [ExportMetadata("Categories", Category.City, IsMultiple = true)] // using untyped metadata considered as bad practice public class NewYork : IPlug { public void Write() { Console.WriteLine("New York"); } } [Export(typeof(IPlug))] [Category(Category.Game)] [Category(Category.News)] public class Football : IPlug { public void Write() { Console.WriteLine("Football"); } }
Tags:
Report Abuse
Subscribe
Discuss
News
About
New Snippet
Recent Snippets
My Snippets
Favorites
Web Code
Search
Copy
Line#