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的属性的信息匹配。
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的属性的信息匹配。
相关文章推荐
- ES6新特性:使用export和import实现模块化
- 使用System.ComponentModel.INotifyPropertyChanged实现Property Changed时的自动通知
- ES6新特性:使用export和import实现模块化
- ES6新特性:使用export和import实现模块化
- C#:System.Array简单使用
- System.ComponentModel.BackgroundWorker在WinForm中的异步使用
- System.ComponentModel.DataAnnotations dll中标签的用法
- JSTL中<c:import />标签的简单使用-以和Spring MVC搭配为例
- ES6新特性:使用export和import实现模块化详解
- ES6新特性:使用export和import实现模块化
- [导入]VS 2005中使用C#的新特性:可空类型
- [导入]VS 2005中使用C#的新特性:可空类型
- 使用C#开发一个简单的P2P应用
- 使用C# Builder建一个简单的ASP.NET应用程序
- C# 3.0新特性初步研究 Part3:使用拉姆达表达式
- C# 3.0新特性初步研究 Part4:使用集合类型初始化器
- C# 3.0新特性初步研究 Part6:使用查询表达式
- VS 2005中使用C#的新特性:可空类型
- 关于 System.ComponentModel.IDataErrorInfo
- VS2005中使用C#的新特性:可空类型