微软给我们提供的强大的组件化开发框架: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的属性的信息匹配。