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);
            }
        }
    
    }

    输出如图:

  • 相关阅读:
    解密百度图片URL
    实例——百度翻译
    解决爬虫中文乱码问题
    爬虫实例——爬取1元夺宝用户头像(借助谷歌浏览器开发者工具)
    爬虫实例——爬取淘女郎相册(通过selenium、PhantomJS、BeautifulSoup爬取)
    爬虫实例——爬取淘女郎的相册(借助谷歌浏览器的开发者工具找出规律快速爬取)
    爬虫实例——通过JS控制滚动条
    破解wingide编辑器
    java数据库数据导入excel
    视频
  • 原文地址:https://www.cnblogs.com/jellochen/p/3671949.html
Copyright © 2011-2022 走看看