Added hammock project to debug streaming issues
[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         /// <summary>
20         /// The MEF Container
21         /// </summary>
22         public CompositionContainer Container;
23         
24         /// <summary>
25         /// Layily initialized singleton instance of IoC
26         /// </summary>
27         static readonly Lazy<IoC> Instance=new Lazy<IoC>();
28
29         /// <summary>
30         /// Gets the singleton instance of IoC
31         /// </summary>
32         public static IoC Current
33         {
34             get { return Instance.Value; }
35         }
36
37         /// <summary>
38         /// Initializes a new instance of the IoC from types exported from the executing assembly
39         /// </summary>
40         public IoC()
41         {
42             var catalog = new AggregateCatalog();
43             catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));            
44             
45             Container=new CompositionContainer(catalog);
46         }
47         
48         /// <summary>
49         /// Initializes all imported properties of the target object
50         /// </summary>
51         /// <typeparam name="T">Type of the target object</typeparam>
52         /// <param name="target">The target object</param>
53         /// <returns>The object with all imported properties initialized</returns>
54         public T Compose<T>(T target)
55         {
56             try
57             {
58                 Container.ComposeParts(target);
59                 return target;
60             }
61             catch (Exception exc)
62             {
63                 Trace.TraceError("Composition Error: {0}",exc);
64                 throw;
65             }
66         }
67     }
68 }