在本文中,将探讨如何使用Managed Extensibility Framework (MEF) 和Windows Communication Foundation (WCF) 来构建一个可组合的应用程序。这种应用程序允许开发者轻松地导入和导出数据,从而实现数据访问层的解耦。
首先,需要创建一个ADO.NET实体数据模型。这个模型将作为应用程序的数据访问层的基础。
接下来,将创建一个新的WCF服务。这个服务将负责处理数据的导入和导出。
在解决方案中,将添加两个新的文件:DataService.cs和IDataService.cs。这两个文件将定义服务接口和实现。
在IDataService.cs文件中,将定义一个GetArticles()方法。这个方法将用于获取文章的标题。
[ServiceContract]
public interface IDataService
{
[OperationContract]
IEnumerable GetArticles();
}
在DataService.cs文件中,将实现GetArticles()方法。这个方法将从数据库中查询文章的标题,并返回一个IEnumerable集合。
public IEnumerable GetArticles()
{
PublishingCompanyEntities context = new PublishingCompanyEntities();
var article = from art in context.Articles select art.Title;
return article;
}
接下来,将创建一个名为Data的类。这个类将负责封装数据。
在Data类中,将添加一个名为Articles的属性。这个属性将用于存储文章的标题。
class Data
{
public IEnumerable Articles { get; set; }
}
在Data类中,将添加一个GetData()方法。这个方法将调用DataService的GetArticles()方法,并返回文章的标题。
class Data
{
public IEnumerable Articles { get; set; }
public IEnumerable GetData()
{
DataService ds = new DataService();
return Articles = ds.GetArticles();
}
}
为了使Data类和Articles属性可以被其他类导入,需要添加Export属性。
[Export]
class Data
{
[Export]
public IEnumerable Articles { get; set; }
public IEnumerable GetData()
{
DataService ds = new DataService();
return ds.GetArticles();
}
}
在Data类的构造函数中,将调用GetData()方法,并设置Articles属性的值。
[Export]
class Data
{
public Data()
{
Articles = GetData();
}
[Export]
public IEnumerable Articles { get; set; }
public IEnumerable GetData()
{
DataService ds = new DataService();
return ds.GetArticles();
}
}
接下来,将创建一个名为App的类。这个类将负责组合容器,并导入Data类。
在App类中,将添加一个Run()方法。这个方法将负责组合容器,并导入Data类。
class App
{
public void Run()
{
var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}
在App类中,将添加一个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);
}
}
在App类中,将创建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);
}
}
最后,在App类的Run()方法中,将遍历Articles属性,并打印出每篇文章的标题。
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);
}
}
}
最后,需要在主程序中调用App类的Run()方法。
static void Main(string[] args)
{
App a = new App();
a.Run();
Console.ReadKey();
}