您的位置:首页 > 编程语言 > C#

C# System.ComponentModel.Composition中的Export和Import特性标签的简单使用。

2018-03-13 00:24 525 查看
微软给我们提供的强大的组件化开发框架:System.ComponentModel.Composition。我也是刚刚接触不久,下面我就班门弄斧,向大家展示下一个简单的demo。using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Reflection;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Go go = new Go();

//获取当前执行的程序集中所有的标有特性标签的代码段
AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());

//将所有Export特性标签存放进组件容器中(其实是一个数组里面)
CompositionContainer container = new CompositionContainer(catalog);

//找到所传入对象中所有拥有Import特性标签的属性,并在组件容器的数组中找到与这些属性匹配的Export特性标签所标注的类,然后进行实例化并给这些属性赋值。
//简而言之,就是找到与Import对应的Export所标注的类,并用这个类的实例来给Import所标注的属性赋值,用于解耦。
container.ComposeParts(go);

if (go.test!=null)
{
go.test.show();
}
Console.ReadLine();
}
}

//定义一个测试接口
interface ITest {
void show();

}

//Export出去的类型和名称都要和Import标注的属性匹配,类型可以写ITest, 也可以写Test
[Export("wakaka",typeof(ITest))]
class Test : ITest
{
public void show()
{
Console.WriteLine("OK");
}
}

class Go
{
[Import("wakaka")]
public ITest test { get; set; }
}
}

代码执行效果截图:



其实这个东西类似于IOC,其实就是一个解耦的功能,我们如想使用其他人写的ITest的实现类,只需要更改下程序集就可以轻松做到,当然前提是其他人写的实现类上的Export特性标签的匹配信息要与我们Import的属性的信息匹配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: