首页 > 其他 > 详细

MEF初体验之十一:查询组合容器

时间:2014-04-18 04:07:03      阅读:361      评论:0      收藏:0      [点我收藏+]

查询组合容器

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

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

GetExportedValue方法

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

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


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

bubuko.com,布布扣
[Export("my_contract_name")]
public class Root
{
}

var container = new CompositionContainer(new AssemblyCatalog(typeof(Program).Assembly));
Root partInstance = container.GetExportedValue<Root>("my_contract_name");
bubuko.com,布布扣

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

最后仍然举个例子:

bubuko.com,布布扣
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);
        }
    }

}
bubuko.com,布布扣

输出如图:

bubuko.com,布布扣

MEF初体验之十一:查询组合容器,布布扣,bubuko.com

MEF初体验之十一:查询组合容器

原文:http://www.cnblogs.com/jellochen/p/3671949.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!