1 // -----------------------------------------------------------------------
\r
2 // Copyright (c) Microsoft Corporation. All rights reserved.
\r
3 // -----------------------------------------------------------------------
\r
6 using System.ComponentModel.Composition;
\r
7 using System.ComponentModel.Composition.Hosting;
\r
8 using System.ComponentModel.Composition.Primitives;
\r
9 using System.Collections.Generic;
\r
10 using System.Linq.Expressions;
\r
11 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
13 namespace System.ComponentModel.Composition.Factories
\r
15 partial class ExportProviderFactory
\r
17 public class RecomposableExportProvider : ExportProvider
\r
19 public static Dictionary<string, object> EmptyMetadataDictionary = new Dictionary<string, object>();
\r
20 public List<Export> _exports = new List<Export>();
\r
22 public void AddExport(string contractName, object value)
\r
24 Export export = CreateExport(contractName, value);
\r
25 var exports = this._exports.ToList();
\r
27 exports.Add(export);
\r
28 ChangeExports(exports);
\r
31 public void RemoveExport(string contractName)
\r
33 int index = FindExport(contractName);
\r
34 Assert.IsTrue(index >= 0);
\r
36 var exports = this._exports.ToList();
\r
38 exports.RemoveAt(index);
\r
40 ChangeExports(exports);
\r
43 public void ReplaceExportValue(string contractName, object newValue)
\r
45 int index = FindExport(contractName);
\r
46 Assert.IsTrue(index >= 0);
\r
48 var exports = this._exports.ToList();
\r
50 exports.RemoveAt(index);
\r
51 exports.Add(CreateExport(contractName, newValue));
\r
53 ChangeExports(exports);
\r
56 private void ChangeExports(List<Export> newExports)
\r
58 using (var atomicComposition = new AtomicComposition())
\r
60 atomicComposition.AddCompleteAction(() => this._exports = newExports);
\r
61 atomicComposition.SetValue(this, newExports);
\r
63 var addedExports = newExports.Except(this._exports).Select(export => export.Definition);
\r
64 var removedExports = this._exports.Except(newExports).Select(export => export.Definition);
\r
66 this.OnExportsChanging(new ExportsChangeEventArgs(addedExports, removedExports, atomicComposition));
\r
68 atomicComposition.AddCompleteAction(() => this.OnExportsChanged(
\r
69 new ExportsChangeEventArgs(addedExports, removedExports, null)));
\r
71 atomicComposition.Complete();
\r
75 private int FindExport(string contractName)
\r
77 for (int i = 0; i < _exports.Count; i++)
\r
79 if (_exports[i].Definition.ContractName == contractName)
\r
87 private Export CreateExport(string contractName, object value)
\r
89 return new Export(new ExportDefinition(contractName, EmptyMetadataDictionary), () => value);
\r
92 protected override IEnumerable<Export> GetExportsCore(ImportDefinition importDefinition, AtomicComposition context)
\r
94 IEnumerable<Export> contextExports;
\r
96 if (context == null || !context.TryGetValue(this, out contextExports))
\r
98 contextExports = this._exports;
\r
101 List<Export> exports = new List<Export>();
\r
102 var func = importDefinition.Constraint.Compile();
\r
103 foreach (Export export in contextExports)
\r
105 if (func(export.Definition))
\r
107 exports.Add(export);
\r