Fixes to Add/Remove accounts
[pithos-ms-client] / trunk / Pithos.ShellExtensions / IoC.cs
1 // <copyright file="IoC.cs" company="GRNet">
2 // This project is open source. Released under the XYZ license
3 // </copyright>
4
5 namespace Pithos.ShellExtensions
6 {
7     using System;
8     using System.ComponentModel.Composition;
9     using System.ComponentModel.Composition.Hosting;
10     using System.Diagnostics;
11     using System.Reflection;
12     
13     /// <summary>
14     /// The IoC class initializes MEF DI and acts as a service locator.
15     /// A singleton instance of IoC is provided by Instance
16     /// </summary>
17     public class IoC
18     {
19         private static readonly log4net.ILog Log = log4net.LogManager.GetLogger("Pithos.Extensions.IoC");
20
21         /// <summary>
22         /// The MEF Container
23         /// </summary>
24         public CompositionContainer Container;
25         
26         /// <summary>
27         /// Layily initialized singleton instance of IoC
28         /// </summary>
29         static readonly Lazy<IoC> Instance=new Lazy<IoC>();
30
31         /// <summary>
32         /// Gets the singleton instance of IoC
33         /// </summary>
34         public static IoC Current
35         {
36             get { return Instance.Value; }
37         }
38
39         /// <summary>
40         /// Initializes a new instance of the IoC from types exported from the executing assembly
41         /// </summary>
42         public IoC()
43         {
44             var catalog = new AggregateCatalog();
45             catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));            
46             
47             Container=new CompositionContainer(catalog);
48         }
49         
50         /// <summary>
51         /// Initializes all imported properties of the target object
52         /// </summary>
53         /// <typeparam name="T">Type of the target object</typeparam>
54         /// <param name="target">The target object</param>
55         /// <returns>The object with all imported properties initialized</returns>
56         public T Compose<T>(T target)
57         {
58             try
59             {
60                 Container.ComposeParts(target);
61                 return target;
62             }
63             catch (Exception exc)
64             {
65                 Log.ErrorFormat("Composition Error: {0}",exc);
66                 throw;
67             }
68         }
69     }
70 }