Mini 容器学习笔记13——插件注入

  Mini容器的插件注入是通过InjectMany的方式来注入多个组件的方式进行的,插件的元数据通过标签的方式进行配置,Mini容器在注入插件的过程中同时也可以把插件的元数据一起注入,这和MEF实现插件框架是一样的。 下面看看Mini容器怎样来实现插件架构的。

     1. 定义插件接口契约,插件元数据标签以及插件元数据接口

   //插件接口
    [Contract]
    public interface IAddIn
    {
        void Start();//启动插件
    }
   

    //插件配置元数据标签
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
    [MetadataAttributeAttribute]
    public class AddInAttribute : ComponentAttribute
    {
        public string Name { get; set; }
        public string Author;
        public string Url;
        public string Version;
    }

    //插件元数据接口
    public interface IAddInMetadata
    {
        string Name { get; }
        string Author { get; }
        string Url { get; }
        string Version { get; }
    }

     2. 定义插件管理器

   //插件管理器接口,用来启动和停止插件的
    [Contract]
    public interface IAddInManager:IStartable
    {
    }

    [Component]
    public class AddInManager:IAddInManager
    {
        [InjectMany]
        IEnumerable<Lazy<IAddIn, IAddInMetadata>> AddIns { get; set; }

        public void Start()
        {
            foreach (var item in AddIns)
            {
                Console.WriteLine(string.Format("Name={0},Author={1},Url={2},Version={3}", item.Metadata.Name,item.Metadata.Author,item.Metadata.Url,item.Metadata.Version));
                item.Value.Start();
            }
        }

        public void Stop()
        {
        }
    }

     3. 实现插件

public abstract class AddInBase : IAddIn    {        public virtual void Start() { }    } 
[AddIn(Name = "Dashboard", Author = "Kevin Wang", Url = "http://netcasewqs.cnblogs.com", Version = "1.0")]
    public class DashboardAddIn : AddInBase
    {
        public override void Start()
        {
            Console.WriteLine("Dashboard start...");
        }
    }

    [AddIn(Name = "Editor", Author = "Kevin Wang", Url = "http://netcasewqs.cnblogs.com", Version = "1.0")]
    public class EditorAddIn : AddInBase
    {
        public override void Start()
        {
            Console.WriteLine("Editer start...");
        }
    }

    [AddIn(Name = "PlayList", Author = "Kevin Wang", Url = "http://netcasewqs.cnblogs.com", Version = "1.0")]
    public class PlaylistAddIn : AddInBase
    {
        public override void Start()
        {
            Console.WriteLine("PlayList start...");
        }
    }
     

   4. 创建宿主程序并测试

[TestFixture]
    public class AddInTest:TestBase
    {
        [Inject]
        IAddInManager AddInManager;

        [Test]
        public void Test()
        {
            ServiceRegistry
                .Register<AddInManager>()
                .Register<DashboardAddIn>()
                .Register<EditorAddIn>()
                .Register<PlaylistAddIn>();


            ServiceRegistry.Compose(this);
        }
    }

   5. 查看运行结果:

Mini 容器官方网站:

       http://nlite.codeplex.com/

推荐资源:

Mini容器介绍

Mini容器学习目录

Mini 容器学习笔记1——环境搭建(基础篇)

Mini 容器学习笔记2——组件元数据(基础篇)

Mini 容器学习笔记3——组件的注册(基础篇)

Mini 容器学习笔记4——组件的生命周期(应用篇)

Mini 容器学习笔记5——组件的获取

Mini 容器学习笔记6——组件的获取(应用)

Mini 容器学习笔记7——构造函数注入

Mini 容器学习笔记8——字段注入

Mini 容器学习笔记9——属性注入

Mini 容器学习笔记10——方法注入

Mini 容器学习笔记11——Lazy注入

Mini 容器学习笔记12——组合实例

Mini 容器学习笔记13——插件注入

Mini 容器学习笔记14——异常处理

Mini 容器学习笔记15——监听器-初始化监听器

Mini 容器学习笔记16——监听器-释放监听器

Mini 容器学习笔记17——监听器-启动/停止监听器

Mini 容器学习笔记18——监听器-AOP监听器

原文地址:https://www.cnblogs.com/netcasewqs/p/2007027.html