.net自带的IOC容器MEF使用
IOC能做什么
IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。
控制反转:
将控制权移交给第三方容器 new 操作
依赖注入:
在程序的运行过程中 动态的给某个对象 注入他所需要的 实例
例子:模拟一个用户购买了一个音乐播放器
用户类
public class User
{
//初始化一个音乐播放器
public MusicPlayer Playe = new MusicPlayer();
public void Play()
{
Playe.Play();
}
}
/// <summary>
/// 音乐播放器
/// </summary>
public class MusicPlayer
{
public void Play()
{
Console.WriteLine("音乐播放器");
}
}

控制台
class Program
{
static void Main(string[] args)
{
var u =new User();
u.Play();
Console.ReadKey();
}
}
输出

需求改变
用户需要将音乐播放器改为视频播放器
1.新建一个视频播放器提供商程序集 以及视频播放器类
/// <summary>
/// 视频播放器
/// </summary>
public class VideoPlayer
{
public void Play()
{
Console.WriteLine("视频播放器");
}
}

2.删除上层的音乐播放器的引用 并引用视频播放器。将用户的new 音乐播放器 改为new视频播放器
public class User
{
public VideoPlayer Playe = new VideoPlayer();
public void Play()
{
Playe.Play();
}
}
执行输出

问题
下层改变 影响上层
修改
遵循设计模式 依赖导致原则
即上层不直接依赖下层。他们都只依赖下层的抽象(抽象类 或接口)
这个时候我们为播放器抽象一个契约

/// <summary>
/// 播放器契约类
/// </summary>
public interface IPlayer
{
void Play();
}
并在音乐播放器 和视频播放器 实现播放契约
/// <summary>
/// 视频播放器
/// </summary>
public class VideoPlayer : IPlayer
{
public void Play()
{
Console.WriteLine("视频播放器");
}
}
/// <summary>
/// 音乐播放器
/// </summary>
public class MusicPlayer:IPlayer
{
public void Play()
{
Console.WriteLine("音乐播放器");
}
}
使用MEF IOC 实现上层与下层的完全解耦
MEF的特点
1. .net4.0新增 在System.ComponentModel.Composition 程序集 不需要引用第三方类库
2. 0配置:MEF是不需要使用配置文件或代码对接口与实现进行一一配对的,只需要简单的使用几个Attribute特性,就能自动完成源与目标的配对工
3. 自动化:系统初始化时自动遍历程序目录或指定文件夹下的dll,根据程序集中接口与类的特定Attribute特性进行自动配对。
开始使用
1、ui层引用契约接口层 而不引用音乐播放器提供商 和 视频播放器提供商
2.引用MEF所需程序集System.ComponentModel.Composition

将托管于IOC容器的类打上Export 并标记他对应的接口
/// <summary>
/// 视频播放器
/// </summary>
[Export(typeof(IPlayer))]
public class VideoPlayer : IPlayer
{
public void Play()
{
Console.WriteLine("视频播放器");
}
}
/// <summary>
/// 音乐播放器
/// </summary>
[Export(typeof(IPlayer))]
public class MusicPlayer:IPlayer
{
public void Play()
{
Console.WriteLine("音乐播放器");
}
}
控制台使用
class Program
{
public static CompositionContainer _container;
static void Main(string[] args)
{
AggregateCatalog catalog = new AggregateCatalog();
//将当前程序集 打了特性Export的类 导入容器
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
//将运行目录下的MusicPlayerManufacturer 打了特性Export的类导入容器
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.Load("MusicPlayerManufacturer")));
_container = new CompositionContainer(catalog);
//在容器中获得User类的对象
var u = _container.GetExportedValue<User>();
u.Play();
Console.ReadKey();
}
}
当我们需要使用视频播放器 只需要将视频播放器的接口复制到bin目录 MEF注入 改为 视频播放器接口就行了
还没写完。。。有空再写
.net自带的IOC容器MEF使用的更多相关文章
- .NET自带IOC容器MEF之初体验
.NET自带IOC容器MEF之初体验 本文主要把MEF作为一种IOC容器进行讲解,.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuil ...
- ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- NET 自带IOC容器MEF指初体验
转自:http://www.cnblogs.com/ulex/p/4186881.html IOC容器:工具较多,大体功能都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动 ...
- .NET自带IOC容器MEF之初体验(转)
本文主要把MEF作为一种IOC容器进行讲解,.net中可用的IOC容器非常多,如 CastleWindsor,Unity,Autofac,ObjectBuilder,StructureMap,Spri ...
- asp.net Core依赖注入(自带的IOC容器)
今天我们主要讲讲如何使用自带IOC容器,虽然自带的功能不是那么强大,但是胜在轻量级..而且..不用引用别的库. 在新的ASP.NET Core中,大量的采用了依赖注入的方式来编写代码. 比如,在我们的 ...
- IOC容器MEF在MVC中的使用
最近想把自己的网站框架用IOC改造下,经过对比,我初步选择autofac,虽然MEF不需要配置,但性能不行,autofac虽然需要自己写自动化注入,但性能非常好. 先分析下各大IOC框架的性能,分两类 ...
- NancyFx中使用自带的IOC容器
/// <summary> /// Cors扩展 /// </summary> public static class IPipelinesExtensions { /// & ...
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...
- .NetCore下使用Autofac做 IOC 容器
在.NetCore中使用自带的IOC容器 写注入的时候会写很多,如果要自己封装的话也达不到预期的效果,所以这里采用Autofac来时替代 .NetCore自带的容器 nuget首先引用Autofac. ...
随机推荐
- 多页的TIFF图片在aspx页面分页显示
一.逻辑实现:将数据库中的二进制TIFF图片读出并分页显示在页面上. 1.显示界面 public FrameDimension MyGuid; ; ; public static MemoryStre ...
- UINavigationBar 和view 重叠覆盖问题
如果没有是storyboard进行界面设计,在ios7之后会遇到rootviewcontroller的view被navigationbar遮盖的问题,其实很好解决 - (void)viewDidLoa ...
- nginx实现单服务代理多域名
通过一台nginx服务器代理多个域名进行跳转,原理很简单,重点在玩法!适用于公司处理域名紧急备案问题. 域名: www.hx123.com www.hx456.com nginx服务器: ginx.c ...
- Win10全屏看视频时任务栏不隐藏
解决办法: 1.对任务栏鼠标右键点击,选择"任务管理器" 2.在进程选项下找到Windows进程中的Windows资源管理器 3.对Windows资源管理器鼠标右键,选择重新启动
- Microsoft Windows* SDK May 2010 或较新版本(兼容 2010 年 6 月 DirectX SDK)GPU Detect
原文链接 下载代码样本 特性/描述 日期: 2016 年 5 月 5 日 GPU Detect 是一种简短的示例,演示了检测系统中主要显卡硬件(包括第六代智能英特尔® 酷睿™ 处理器产品家族)的方式. ...
- 实例:对2个Makefile的备注
实例1:Makefile编译链接简单.c函数 example.c Makefile exe: example.c gcc example.c -o exe clean: rm exe 执行效果: 实例 ...
- Strust OGNL详解
首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...
- hdu----(1849)Rabbit and Grass(简单的尼姆博弈)
Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- SQL操作符
Oracle中的操作符算术操作符:无论是在sqlserver,或者是java中,每种语言它都有算术操作符,大同小异. Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle ...
- codevs 1052 地鼠游戏
1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...