C#进阶系列
第三章 【C#进阶系列】【MEF框架(三)】
第二章 【C#进阶系列】【MEF框架(二)】
第一章 【C#进阶系列】【MEF框架(一)】
前言
在(一)已经对MEF作了基本的介绍,前面都是介绍如何导出类,这里针对MEF如何导出方法、属性作一些补充。
一、导出属性
直接看下面代码示例,和导出类没啥区别
namespace MEF_P1
{
public interface IBookService
{
string GetBookName();
}
[Export("ContractName_MathBook")]
public class MathBook : IBookService
{
//导出私有属性
[Export(typeof(string))]
private string _privateBookName = "Private MathBook BookName";
//导出公有属性
[Export(typeof(string))]
public string _publicBookName = "Public MathBook BookName";
public string GetBookName()
{
return "MathBook";
}
}
[Export("ContractName_ChineseBook")]
public class ChineseBook : IBookService
{
public string GetBookName()
{
return "ChineseBook";
}
}
class Program
{
//导入属性,这里不区分public还是private
[ImportMany]
public List<string> InputString { get; set; }
public object Services_MathBook { get; set; }
public object Services_ChineseBook { get; set; }
static void Main(string[] args)
{
Program pro = new Program();
pro.Compose();
if (pro.Services_MathBook != null)
{
Console.WriteLine(((IBookService)pro.Services_MathBook).GetBookName());
}
if (pro.Services_ChineseBook != null)
{
Console.WriteLine(((IBookService)pro.Services_ChineseBook).GetBookName());
}
foreach (var str in pro.InputString)
{
Console.WriteLine(str);
}
Console.Read();
}
private void Compose()
{
//创建一个程序集目录,用于从一个程序集获取所有的组件定义
AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
//创建容器
CompositionContainer container = new CompositionContainer(catalog);
//组合部件:如果该类有Import,就会自动去寻找Export
container.ComposeParts(this);
//直接通过契约名获取Export
Services_MathBook = container.GetExportedValue<object>("ContractName_MathBook");
Services_ChineseBook = container.GetExportedValue<object>("ContractName_ChineseBook");
}
}
}
二、导出方法
导出方法会特殊点,也区分带参数和不带参数,用法和委托有点类似
有返回值的使用Func委托,无返回值的使用Action委托。
namespace MEF_P1
{
public interface IBookService
{
string GetBookName();
}
[Export("ContractName_MathBook")]
public class MathBook : IBookService
{
//导出私有属性
[Export(typeof(string))]
private string _privateBookName = "Private MathBook BookName";
//导出公有属性
[Export(typeof(string))]
public string _publicBookName = "Public MathBook BookName";
//导出私有无参方法
[Export(typeof(Func<string>))]
public string GetBookName()
{
return "MathBook";
}
//导出公有带参方法
[Export(typeof(Func<int, string>))]
public string GetBookPrice(int price)
{
return "¥" + price;
}
}
[Export("ContractName_ChineseBook")]
public class ChineseBook : IBookService
{
public string GetBookName()
{
return "ChineseBook";
}
}
class Program
{
//导入属性,这里不区分public还是private
[ImportMany]
public List<string> InputString { get; set; }
//导入无参数方法
[Import]
public Func<string> methodWithoutPara { get; set; }
//导入有参数方法
[Import]
public Func<int, string> methodWithPara { get; set; }
public object Services_MathBook { get; set; }
public object Services_ChineseBook { get; set; }
static void Main(string[] args)
{
Program pro = new Program();
pro.Compose();
if (pro.Services_MathBook != null)
{
Console.WriteLine(((IBookService)pro.Services_MathBook).GetBookName());
}
if (pro.Services_ChineseBook != null)
{
Console.WriteLine(((IBookService)pro.Services_ChineseBook).GetBookName());
}
foreach (var str in pro.InputString)
{
Console.WriteLine(str);
}
//调用无参数方法
if (pro.methodWithoutPara != null)
{
Console.WriteLine(pro.methodWithoutPara());
}
//调用有参数方法
if (pro.methodWithPara != null)
{
Console.WriteLine(pro.methodWithPara(3000));
}
Console.Read();
}
private void Compose()
{
//创建一个程序集目录,用于从一个程序集获取所有的组件定义
AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
//创建容器
CompositionContainer container = new CompositionContainer(catalog);
//组合部件:如果该类有Import,就会自动去寻找Export
container.ComposeParts(this);
//直接通过契约名获取Export
Services_MathBook = container.GetExportedValue<object>("ContractName_MathBook");
Services_ChineseBook = container.GetExportedValue<object>("ContractName_ChineseBook");
}
}
}
总结
依赖倒置原则:高层模板不应该依赖于底层模板,两者应该依赖于抽象,而抽象不应该依赖于细节。
】&spm=1001.2101.3001.5002&articleId=129098584&d=1&t=3&u=fba293aa2abb4c3ea583ac4d9e19f2b2)
6677

被折叠的 条评论
为什么被折叠?



