在本文中,将探讨如何使用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();
        }