forked from ThatRendle/Simple.Data
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMefHelper.cs
More file actions
109 lines (101 loc) · 4.08 KB
/
MefHelper.cs
File metadata and controls
109 lines (101 loc) · 4.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition.Hosting;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
namespace Simple.Data
{
using System.Diagnostics;
class MefHelper : Composer
{
public override T Compose<T>()
{
using (var container = CreateAppDomainContainer())
{
var exports = container.GetExports<T>().ToList();
if (exports.Count == 1)
{
return exports.Single().Value;
}
}
using (var container = CreateFolderContainer())
{
var exports = container.GetExports<T>().ToList();
if (exports.Count == 0) throw new SimpleDataException("No ADO Provider found.");
if (exports.Count > 1) throw new SimpleDataException("Multiple ADO Providers found; specify provider name or remove unwanted assemblies.");
return exports.Single().Value;
}
}
public override T Compose<T>(string contractName)
{
try
{
using (var container = CreateAppDomainContainer())
{
var exports = container.GetExports<T>(contractName).ToList();
if (exports.Count == 1)
{
return exports.Single().Value;
}
}
using (var container = CreateFolderContainer())
{
var exports = container.GetExports<T>(contractName).ToList();
if (exports.Count == 0) throw new SimpleDataException(string.Format("No {0} Provider found.", contractName));
if (exports.Count > 1) throw new SimpleDataException("Multiple ADO Providers found; specify provider name or remove unwanted assemblies.");
return exports.Single().Value;
}
}
catch (ReflectionTypeLoadException ex)
{
SimpleDataTraceSources.TraceSource.TraceEvent(TraceEventType.Error, SimpleDataTraceSources.GenericErrorMessageId,
"Compose failed: {0}", ex.Message);
throw;
}
}
public static T GetAdjacentComponent<T>(Type knownSiblingType)
{
using (var assemblyCatalog = new AssemblyCatalog(knownSiblingType.Assembly))
{
using (var container = new CompositionContainer(assemblyCatalog))
{
return container.GetExportedValueOrDefault<T>();
}
}
}
private static CompositionContainer CreateFolderContainer()
{
var path = GetSimpleDataAssemblyPath ();
var assemblyCatalog = new AssemblyCatalog(ThisAssembly);
var aggregateCatalog = new AggregateCatalog(assemblyCatalog);
foreach (string file in System.IO.Directory.GetFiles(path, "Simple.Data.*.dll"))
{
var catalog = new AssemblyCatalog(file);
aggregateCatalog.Catalogs.Add(catalog);
}
return new CompositionContainer(aggregateCatalog);
}
private static CompositionContainer CreateAppDomainContainer()
{
var aggregateCatalog = new AggregateCatalog();
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies().Where(IsSimpleDataAssembly))
{
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(assembly));
}
return new CompositionContainer(aggregateCatalog);
}
private static bool IsSimpleDataAssembly(Assembly assembly)
{
try
{
return assembly.GetFullName().StartsWith("Simple.Data.", StringComparison.OrdinalIgnoreCase);
}
catch
{
return false;
}
}
}
}