In this article, I will be creating a Data Access Layer using WCF. I will be using MEF(Managed Extensibility Framework) to export the data from the Data Access Layer class and then import it.
MEF(Managed Extensibility Framework) offers a nice way to create Composable applications where I can easily import and export data.
Created a ADO.Net Entity Data Model as shown in diagram below:
Create a new WCF Service as shown below:
Two files would be added to the solution as DataService and IDataService.cs.
Add a method GetArticles() to IDataService.cs:
- [ServiceContract]
- public interface IDataService
- {
- [OperationContract]
- IEnumerable GetArticles();
- }
Implement the method in DataService.cs:
- public IEnumerable GetArticles()
- {
- PublishingCompanyEntities context = new PublishingCompanyEntities();
- var article = from art in context.Articles
- select art.Title;
- return article;
- }
Creating a Data Class:
- Create a class named as Data
- Add a property named Articles.
- class Data
- {
- public IEnumerable Articles { get; set; }
- }
- Add the Method GetData(). Call the method GetArticles() of DataService .
- class Data
- {
- public IEnumerable Articles { get; set; }
- public IEnumerable GetData()
- {
- DataService ds = new DataService();
- return Articles = ds.GetArticles();
- }
- }
- Add the Export attribute on the property Articles.
- class Data
- {
- [Export]
- public IEnumerable Articles { get; set; }
- public IEnumerable GetData()
- {
- DataService ds = new DataService();
- return ds.GetArticles();
- }
- }
- Also add an Export attribute on the Data Class.
- [Export]
- class Data
- {
- [Export]
- public IEnumerable Articles { get; set; }
- public IEnumerable GetData()
- {
- DataService ds = new DataService();
- return ds.GetArticles();
- }
- }
- I need to set the value of the Articles Property. I will do that in the Contructor of the Data Class. So here is my final class.
- [Export]
- class Data
- {
- public Data()
- {
- Articles = GetData();
- }
- [Export]
- public IEnumerable Articles { get; set; }
- public IEnumerable GetData()
- {
- DataService ds = new DataService();
- return Articles = ds.GetArticles();
- }
- }
Creating another class App
- Create a class App.
- Add a method Run() and put the code to compose the container.
- class App
- {
- public void Run()
- {
- var catalog = new AssemblyCatalog (System.Reflection.Assembly.GetExecutingAssembly());
- var container = new CompositionContainer(catalog);
- container.ComposeParts(this);
- }
- }
- Create a property Articles and this time add an import attribute
- 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);
- }
- }
- Create an object for the Data Class and Import it.
- 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);
- }
- }
- Add a foreach to iterate through the 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);
- }
- }
- }
Please note that to add the Export and Import attributes you need to add a reference to System.ComponentModel.Composition.
Call the App class now.
- static void Main(string[] args)
- {
- App a = new App();
- a.Run();
- Console.ReadKey();
- }
It works. Happy Coding.