zoukankan      html  css  js  c++  java
  • MEF初体验之十一:查询组合容器

    查询组合容器

    组合容器暴露了几个get exports的重载方法和导出对象和对象集合。
    你需要注意下面的行为:

    • 当请求单个对象实例时,如果未发现导出,一个异常将被抛出
    • 当请求单个对象实例时,如果发现超过一个,一个异常将被抛出

    GetExportedValue方法

    在下面的代码片段中,我们请求一个Root(契约)实例的对象

    var container = new CompositionContainer(new AssemblyCatalog(typeof(Program).Assembly));
    Root partInstance = container.GetExportedValue<Root>();


    如果你在一个不同的契约名字下有一个导出,你将需要使用一个不同的重载:

    [Export("my_contract_name")]
    public class Root
    {
    }
    
    var container = new CompositionContainer(new AssemblyCatalog(typeof(Program).Assembly));
    Root partInstance = container.GetExportedValue<Root>("my_contract_name");

    GetExport方法

    GetExport方法检索Export的一个Lazy的实例引用。访问export的Value属性将促使导出实例被创建。导出值的连续调用将返回相同的对象,而不管部件是否有一个共享/非共享的生命周期。

    Lazy<Root> export = container.GetExport<Root>();
    var root = export.Value; //create the instance.

    GetExportedValueOrDefault方法

    GetExportedValueOrDefault方法恰好GetExportedValue方法一样工作,不同的是在没有匹配情况下它不会抛出一个异常。

    var root = container.GetExportedValueOrDefault<Root>(); // may return null

    最后仍然举个例子:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.Composition;
    using System.ComponentModel.Composition.Hosting;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace QueryingCompositionContainer
    {
        class Program
        {
            [Import]
            public IMessageSender Sender { get; set; }
            static void Main(string[] args)
            {
                Program p = new Program();
                p.Run();
                Console.ReadKey();
            }
            void Run()
            {
                var catalog = new AssemblyCatalog(typeof(Program).Assembly);
                var container = new CompositionContainer(catalog);
                container.ComposeParts(this);
    
                IMessageSender s = container.GetExportedValue<IMessageSender>();
                Console.WriteLine(s == Sender);
                IMessageSender s2 = container.GetExportedValueOrDefault<EmailSender>();
                if(s2 == null)
                    Console.WriteLine("Exported EmailSender is null");
                Lazy<IMessageSender> s3 = container.GetExport<IMessageSender>();
                var s3_1 = s3.Value;
                var s3_2 = s3.Value;
                Console.WriteLine(s3_1 == s3_2);//True,Lazy<T>特性
                Console.WriteLine(s3_1 == Sender);
            }
        }
        interface IMessageSender
        {
            void Send(string msg);
        }
        [Export(typeof(IMessageSender))]
        class EmailSender : IMessageSender
        {
            public void Send(string msg)
            {
                Console.WriteLine("Email sent:" + msg);
            }
        }
    
    }

    输出如图:

  • 相关阅读:
    游戏中的角色移动:闭包(closure)在实际开发中的作用
    第六章 函数[DDT书本学习 小甲鱼]【1】
    Python模块EasyGui专题学习
    第十章 图形用户界面入门[DDT书本学习 小甲鱼]【1】
    第五章 列表、元组和字符串[DDT书本学习 小甲鱼]【7】
    ueditor 配置和上传图片
    常用的48个jQuery小技术点
    js 全选 ,全不选,反选的实现
    一个简单的登录页面,效果不错哦!
    关于模态框的引入
  • 原文地址:https://www.cnblogs.com/jellochen/p/3671949.html
Copyright © 2011-2022 走看看