MEF实例

namespace MEFDemo
{
 
    class Program
    {
        private CompositionContainer _container;
        [ImportMany(typeof(ICalculator))]
        IEnumerable<Lazy<ICalculator>> calculators;

public Program()
        {
            var catalog = new AssemblyCatalog(typeof(Program).Assembly);
            _container = new CompositionContainer(catalog);
            try
            {
                this._container.ComposeParts(this);
            }
            catch (CompositionException compositionException)
            {
                Console.WriteLine(compositionException.ToString());
            }
        }

static void Main(string[] args)
        {
            Program p = new Program();
            string s;
            Console.WriteLine("Enter Command:");
            while (true)
            {
                s = Console.ReadLine();
                foreach (Lazy<ICalculator> i in p.calculators)
                {
                    Console.WriteLine(i.Value.Calculate(s));
                }
            }
        }
    }
    public interface ICalculator
    {
        String Calculate(String input);
    }
    [Export(typeof(ICalculator))]    
    class Add : ICalculator
    {
        string ICalculator.Calculate(string input)
        {
            return "Symbol=a,输入值" + input;
        }
    }

[Export(typeof(ICalculator))]   
    class Add2 : ICalculator
    {
        string ICalculator.Calculate(string input)
        {
            return "Symbol=b,输入值" + input;
        }
    }
}

时间: 2024-10-21 03:38:58

MEF实例的相关文章

MEF依赖注入实例

什么是MEF 先来看msdn上面的解释:MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置. 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项. 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展. 也有人把MEF解释为"依赖注入"的一种方式,那么什么是"依赖注入"?如果这样解释,感觉越陷越深......根据博

MEF实现设计上的“松耦合”(一)

1.什么是MEF 先来看msdn上面的解释:MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置. 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项. 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展. 也有人把MEF解释为“依赖注入”的一种方式,那么什么是“依赖注入”?如果这样解释,感觉越陷越深......根据博主的理解,了解MEF只需要

MEF 编程指南(十一):查询 CompositionContainer

CompositionContainer 公开了一部分获取导出.导出对象以及两者集合的重载. 在这些方法重载中,你应该遵循下面的共享行为准则 - 除非特别说明. 当请求单一实例的时候,如果没发现任何导入,将会抛出异常. 当请求单一实例的时候,如果发现不止一个导入,将会抛出异常. GetExportedValue 在下面的代码片段里,我们请求 Root(契约)实例的实例. var container = new CompositionContainer(new AssemblyCatalog(ty

MEF 编程指南(十):重组

有些应用程序被设计成在运行时动态地改变.例如,一个新的扩展可能被下载,或者其他原因变得不可用.MEF 依靠我们称之为重组(Composition)的技术处理,在初始化组合以后改变导入值的场景. 导入可以通过 [System.ComponentModel.Composition.ImportAttribute] 使用 Allowrecompostion 属性通知 MEF 支持重组.参考下面的代码: [Export] public class HttpServerHealthMonitor { [I

实战MEF(2):导出&amp;导入

上一文中,我们大致明白了,利用MEF框架实现自动扫描并组装扩展组件的思路.本文我们继续前进,从最初的定义公共接口开始,一步步学会如何使用MEF. 在上一文中我们知道,对于每一个实现了公共规范的扩展组件,都需要进行导出,随后我们的主应用程序文件中会自动进行组装.这便产生了一个疑问:为什么需要导出? 如果大家还记得,以前我们用VC++写.dll文件时,都会把需要提供给别人调用的函数标记为导出函数,这样别人才能调用我们编写的函数.就好比我们的家,我们一般会有客厅,既然叫客厅,当然是展现给客人看的.有客

MEF入门之不求甚解,但力求简单能讲明白(二)

在上一篇文章中,我们已经学到了很基本的MEF概念和使用方法. 但我们导出的是一个object类型的实例,只能用来tostring,没有引用部件类库,也不能用里面的成员方法. 本篇,我们逐渐往简单的文件管理器的目标靠拢. 新建类库IPart,添加一个接口IFileHandler.cs namespace IPart { public interface IFileHandler { void Process(); } } Parts类库和主项目meftest均引用IPart Parts类库中,将要

Windows10(UWP)下的MEF

前言 最近在帮一家知名外企开发Universal Windows Platform的相关应用,开发过程中不由感慨:项目分为两种,一种叫做前人栽树后人乘凉,一种叫做前人挖坑后人遭殃.不多说了,多说又要变成月经贴了. 讲讲MEF. MEF全称Managed Extensibility Framework.我们做.Net的碰到依赖注入(DI:Dependency Injection)这一块的内容,一般会选择使用Unity或者MEF,这也是Prism主要使用的两种方式.在.Net 4.0之前,MEF一直

[zhuan]《MEF程序设计指南》博文汇总

http://www.cnblogs.com/beniao/archive/2010/08/11/1797537.html 在MEF之前,人们已经提出了许多依赖注入框架来解决应用的扩展性问题,比如OSGI 实现以Spring 等等.在 Microsoft 的平台上,.NET Framework 自身内部包含组件模型和 System.Addin.同时存在若干种开源解决方案,包括 SharpDevelop 的 SODA 体系结构和“控制反转”容器(如 Castle Windsor.Structure

(2)从实际项目谈起,基于MEF框架的插件的总体设计

1.MEF框架简介 MEF的全称是Managed Extensibility Framework(MEF),其是.net4.0的组成部分,在3.5上也可以使用.熟悉java中的spring框架的人,对这个框架中涉及的几个概念应该会比较容易理解. 这里我先把我两年前的一个完整的利用MEF搭建的插件式系统中涉及到的MEF框架里的几个基本概念大致描述下. 1.1 依赖注入(export.import) MEF框架中提供 import和export功能,即注入和导出.Spring中有依赖注入这个概念,这