MEF 与 WCF – 启动






1.63/5 (8投票s)
MEF 与 WCF
引言
在本文中,我将使用 WCF 创建一个数据访问层。我将使用 MEF 导出数据访问层类中的数据,然后导入它。
MEF 提供了一种很好的方式来创建可组合的应用程序,我可以轻松地导入和导出数据。
创建如图所示的 ADO.NET 实体数据模型

创建如图所示的新 WCF 服务

将向解决方案中添加两个文件,分别是 DataService 和 IDataService.cs。
在 IDataService.cs 中添加方法 GetArticles()
。
[ServiceContract]
public interface IDataService
{
[OperationContract]
IEnumerable GetArticles();
}
在 DataService.cs 中实现该方法
public IEnumerable GetArticles()
{
PublishingCompanyEntities context = new PublishingCompanyEntities();
var article = from art in context.Articles
select art.Title;
return article;
}
创建数据类
- 创建一个名为
Data
的类。class Data { }
- 添加一个名为
Articles
的属性。class Data { public IEnumerable Articles { get; set; } }
- 添加方法
GetData()
。调用DataService
的GetArticles()
方法。class Data { public IEnumerable Articles { get; set; } public IEnumerable GetData() { DataService ds = new DataService(); return Articles = ds.GetArticles(); } }
- 在属性
Articles
上添加Export
特性。class Data { [Export] public IEnumerable Articles { get; set; } public IEnumerable GetData() { DataService ds = new DataService(); return ds.GetArticles(); } }
- 还在
Data
类上添加一个Export
特性。[Export] class Data { [Export] public IEnumerable Articles { get; set; } public IEnumerable GetData() { DataService ds = new DataService(); return ds.GetArticles(); } }
- 我需要设置
Articles
属性的值。我将在Data
类的构造函数中执行此操作。所以这是我的最终类[Export] class Data { public Data() { Articles = GetData(); } [Export] public IEnumerable Articles { get; set; } public IEnumerable GetData() { DataService ds = new DataService(); return Articles = ds.GetArticles(); } }
创建另一个类 App
- 创建一个类
App
。class App { }
- 添加一个方法
Run()
并放入代码以组合容器。class App { public void Run() { var catalog = new AssemblyCatalog (System.Reflection.Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this); } }
- 创建一个属性
Articles
,这次添加一个import
特性。class App { [Import] public IEnumerable Articles { get; set;} public void Run() { var catalog = new AssemblyCatalog (System.Reflection.Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this); } }
- 创建
Data
类的对象并Import
它。class App { [Import] public IEnumerable Articles { get; set;} [Import] Data data; public void Run() { var catalog = new AssemblyCatalog (System.Reflection.Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this); } }
- 通过文章添加一个
foreach
循环。class App { [Import] public IEnumerable Articles { get; set;} [Import] Data data; public void Run() { var catalog = new AssemblyCatalog (System.Reflection.Assembly.GetExecutingAssembly()); var container = new CompositionContainer(catalog); container.ComposeParts(this); foreach (string art in Articles) { Console.WriteLine(art); } } }
请注意,添加 Export
和 Import
特性需要包含 System.ComponentModel.Composition
。
现在调用 App
类。
static void Main(string[] args)
{
App a = new App();
a.Run();
Console.ReadKey();
}
它有效! 编码愉快。
历史
- 2011 年 7 月 23 日:初始版本