PageRenderTime 46ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/mcs/class/System.ComponentModel.Composition/Tests/ComponentModelUnitTest/System/ComponentModel/Composition/Hosting/CatalogExportProviderTests.cs

https://bitbucket.org/danipen/mono
C# | 599 lines | 458 code | 133 blank | 8 comment | 4 complexity | 860b66ff3dcb13b2d98080f9c2fa6fd8 MD5 | raw file
Possible License(s): Unlicense, Apache-2.0, LGPL-2.0, MPL-2.0-no-copyleft-exception, CC-BY-SA-3.0, GPL-2.0
  1. // -----------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. // -----------------------------------------------------------------------
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Diagnostics;
  7. using System.ComponentModel.Composition.Diagnostics;
  8. using System.ComponentModel.Composition.Factories;
  9. using System.ComponentModel.Composition.Hosting;
  10. using System.ComponentModel.Composition.Primitives;
  11. using System.Linq;
  12. using System.UnitTesting;
  13. using Microsoft.VisualStudio.TestTools.UnitTesting;
  14. namespace System.ComponentModel.Composition
  15. {
  16. [TestClass]
  17. public class ComposablePartCatalogExportProviderTests
  18. {
  19. [TestMethod]
  20. public void Constructor_NullAsCatalogArgument_ShouldThrowArgumentNull()
  21. {
  22. ExceptionAssert.ThrowsArgument<ArgumentNullException>("catalog", () =>
  23. {
  24. new CatalogExportProvider((ComposablePartCatalog)null);
  25. });
  26. }
  27. [TestMethod]
  28. public void Constructor_ValueAsCatalogArgument_ShouldSetCatalogPropertyToEmpty()
  29. {
  30. var expectations = Expectations.GetCatalogs();
  31. foreach (var e in expectations)
  32. {
  33. var provider = new CatalogExportProvider(e);
  34. Assert.AreSame(e, provider.Catalog);
  35. }
  36. }
  37. [TestMethod]
  38. public void Catalog_WhenDisposed_ShouldThrowObjectDisposed()
  39. {
  40. var provider = CreateCatalogExportProvider();
  41. provider.Dispose();
  42. ExceptionAssert.ThrowsDisposed(provider, () =>
  43. {
  44. var catalog = provider.Catalog;
  45. });
  46. }
  47. [TestMethod]
  48. public void SourceProvider_NullAsValueArgument_ShouldThrowArgumentNull()
  49. {
  50. var provider = CreateCatalogExportProvider();
  51. ExceptionAssert.ThrowsArgument<ArgumentNullException>("value", () =>
  52. {
  53. provider.SourceProvider = null;
  54. });
  55. }
  56. [TestMethod]
  57. public void GetExports_WhenRejectedDefinitionRequiredImportIsAdded_ShouldBeResurrected()
  58. {
  59. var part = PartFactory.CreateImporterExporter("Export", "Import");
  60. var provider = CreateCatalogExportProvider(part);
  61. var sourceProvider = ExportProviderFactory.CreateRecomposable();
  62. provider.SourceProvider = sourceProvider;
  63. var exports = provider.GetExports<object>("Export");
  64. EnumerableAssert.IsEmpty(exports, "definition should have been rejected.");
  65. // Resurrect the definition
  66. sourceProvider.AddExport("Import", new object());
  67. exports = provider.GetExports<object>("Export");
  68. Assert.AreEqual(1, exports.Count(), "definition should have been resurrected.");
  69. }
  70. [TestMethod]
  71. public void GetExports_WhenMultipleRejectedDefinitionsRequiredImportsAreAdded_ShouldBeResurrected()
  72. {
  73. var part1 = PartFactory.CreateImporterExporter("Export", "Import");
  74. var part2 = PartFactory.CreateImporterExporter("Export", "Import");
  75. var provider = CreateCatalogExportProvider(part1, part2);
  76. var sourceProvider = ExportProviderFactory.CreateRecomposable();
  77. provider.SourceProvider = sourceProvider;
  78. var exports = provider.GetExports<object>("Export");
  79. EnumerableAssert.IsEmpty(exports, "definition1 and definition2 should have been rejected.");
  80. // Resurrect both definitions
  81. sourceProvider.AddExport("Import", new object());
  82. exports = provider.GetExports<object>("Export");
  83. Assert.AreEqual(2, exports.Count(), "definition1 and definition2 should have been resurrected.");
  84. }
  85. [TestMethod]
  86. [WorkItem(743740)]
  87. public void GetExports_AfterResurrectedDefinitionHasBeenRemovedAndReaddedToCatalog_ShouldNotBeTreatedAsRejected()
  88. {
  89. var definition1 = PartDefinitionFactory.Create(PartFactory.CreateImporterExporter("Export", "Import"));
  90. var definition2 = PartDefinitionFactory.Create(PartFactory.CreateImporterExporter("Export", "Import"));
  91. var catalog = CatalogFactory.CreateMutable(definition1, definition2);
  92. var provider = CreateCatalogExportProvider(catalog);
  93. var sourceProvider = ExportProviderFactory.CreateRecomposable();
  94. provider.SourceProvider = sourceProvider;
  95. var exports = provider.GetExports<object>("Export");
  96. EnumerableAssert.IsEmpty(exports, "definition1 and definition2 should have been rejected.");
  97. // Resurrect both definitions
  98. sourceProvider.AddExport("Import", new object());
  99. exports = provider.GetExports<object>("Export");
  100. Assert.AreEqual(2, exports.Count(), "definition1 and definition2 should have been resurrected.");
  101. catalog.RemoveDefinition(definition1);
  102. exports = provider.GetExports<object>("Export");
  103. Assert.AreEqual(1, exports.Count(), "definition1 should have been removed.");
  104. catalog.AddDefinition(definition1);
  105. exports = provider.GetExports<object>("Export");
  106. Assert.AreEqual(2, exports.Count(), "definition1 and definition2 should be both present.");
  107. }
  108. #if !SILVERLIGHT
  109. [TestMethod]
  110. public void GetExports_WhenDefinitionIsRejected_ShouldTraceWarning()
  111. {
  112. using (TraceContext context = new TraceContext(SourceLevels.Warning))
  113. {
  114. var part = PartFactory.CreateImporterExporter("Export", "Import");
  115. var provider = CreateCatalogExportProvider(part);
  116. provider.SourceProvider = ExportProviderFactory.CreateRecomposable();
  117. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  118. {
  119. provider.GetExport<object>("Export");
  120. });
  121. Assert.IsNotNull(context.LastTraceEvent);
  122. Assert.AreEqual(context.LastTraceEvent.EventType, TraceEventType.Warning);
  123. Assert.AreEqual(context.LastTraceEvent.Id, TraceId.Rejection_DefinitionRejected);
  124. }
  125. }
  126. [TestMethod]
  127. public void GetExports_WhenDefinitionIsResurrected_ShouldTraceInformation()
  128. {
  129. using (TraceContext context = new TraceContext(SourceLevels.Information))
  130. {
  131. var part = PartFactory.CreateImporterExporter("Export", "Import");
  132. var sourceProvider = ExportProviderFactory.CreateRecomposable();
  133. var provider = CreateCatalogExportProvider(part);
  134. provider.SourceProvider = sourceProvider;
  135. ExceptionAssert.Throws<ImportCardinalityMismatchException>(() =>
  136. {
  137. provider.GetExport<object>("Export");
  138. });
  139. // Add the required export to the source provider 'resurrect' the part
  140. sourceProvider.AddExport("Import", "Value");
  141. provider.GetExport<object>("Export");
  142. Assert.IsNotNull(context.LastTraceEvent);
  143. Assert.AreEqual(context.LastTraceEvent.EventType, TraceEventType.Information);
  144. Assert.AreEqual(context.LastTraceEvent.Id, TraceId.Rejection_DefinitionResurrected);
  145. }
  146. }
  147. [TestMethod]
  148. public void GetExports_WhenDefinitionsAreResurrected_ShouldTraceInformation()
  149. {
  150. using (TraceContext context = new TraceContext(SourceLevels.Information))
  151. {
  152. var part1 = PartFactory.CreateImporterExporter("Export", "Import");
  153. var part2 = PartFactory.CreateImporterExporter("Export", "Import");
  154. var sourceProvider = ExportProviderFactory.CreateRecomposable();
  155. var provider = CreateCatalogExportProvider(part1, part2);
  156. provider.SourceProvider = sourceProvider;
  157. EnumerableAssert.IsEmpty(provider.GetExports<object>("Export"));
  158. // Add the required export to the source provider 'resurrect' the part
  159. sourceProvider.AddExport("Import", "Value");
  160. provider.GetExports<object>("Export");
  161. Assert.AreEqual(4, context.TraceEvents.Count); // 2 for rejection, 2 for resurrection
  162. Assert.AreEqual(context.TraceEvents[2].EventType, TraceEventType.Information);
  163. Assert.AreEqual(context.TraceEvents[3].EventType, TraceEventType.Information);
  164. Assert.AreEqual(context.TraceEvents[2].Id, TraceId.Rejection_DefinitionResurrected);
  165. Assert.AreEqual(context.TraceEvents[3].Id, TraceId.Rejection_DefinitionResurrected);
  166. }
  167. }
  168. #endif
  169. [TestMethod]
  170. [TestProperty("Type", "Integration")]
  171. public void BasicTest()
  172. {
  173. var catalog = CatalogFactory.CreateDefaultAttributed();
  174. var catalogExportProvider = new CatalogExportProvider(catalog);
  175. catalogExportProvider.SourceProvider = catalogExportProvider;
  176. var testName = AttributedModelServices.GetContractName(typeof(CatalogComponentTest));
  177. var testNameNonComponent = AttributedModelServices.GetContractName(typeof(CatalogComponentTestNonComponentPart));
  178. var testInterfaceName = AttributedModelServices.GetContractName(typeof(ICatalogComponentTest));
  179. Assert.AreEqual(1, catalogExportProvider.GetExports(ImportFromContract(testName)).Count());
  180. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContract(testNameNonComponent)).Count());
  181. var exports = catalogExportProvider.GetExports(ImportFromContract(testInterfaceName));
  182. Assert.AreEqual(2, exports.Count(), "There should be 2 of them");
  183. foreach (var i in exports)
  184. Assert.IsNotNull(i.Value, "Should get a value");
  185. }
  186. [TestMethod]
  187. [TestProperty("Type", "Integration")]
  188. public void BasicTestWithRequiredMetadata_NoTypeConstraint()
  189. {
  190. var catalog = CatalogFactory.CreateDefaultAttributed();
  191. var catalogExportProvider = new CatalogExportProvider(catalog);
  192. catalogExportProvider.SourceProvider = catalogExportProvider;
  193. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithNoFoo", new string[] { "Foo" }, new Type[] {typeof(object)})).Count());
  194. Assert.AreEqual(1, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithFoo", new string[] { "Foo" }, new Type[] { typeof(object) })).Count());
  195. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithFoo", new string[] { "Foo", "Bar" }, new Type[] { typeof(object), typeof(object) })).Count());
  196. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithNoFoo", new string[] { "Foo" }, new Type[] { typeof(object) })).Count());
  197. Assert.AreEqual(1, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithFoo", new string[] { "Foo" }, new Type[] { typeof(object) })).Count());
  198. }
  199. [TestMethod]
  200. [TestProperty("Type", "Integration")]
  201. public void BasicTestWithRequiredMetadata_TypeConstraint()
  202. {
  203. var catalog = CatalogFactory.CreateDefaultAttributed();
  204. var catalogExportProvider = new CatalogExportProvider(catalog);
  205. catalogExportProvider.SourceProvider = catalogExportProvider;
  206. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithNoFoo", new string[] { "Foo" }, new Type[] { typeof(string) })).Count());
  207. Assert.AreEqual(1, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithFoo", new string[] { "Foo" }, new Type[] { typeof(string) })).Count());
  208. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithFoo", new string[] { "Foo", "Bar" }, new Type[] { typeof(string), typeof(string) })).Count());
  209. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithNoFoo", new string[] { "Foo" }, new Type[] { typeof(string) })).Count());
  210. Assert.AreEqual(1, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithFoo", new string[] { "Foo" }, new Type[] { typeof(string) })).Count());
  211. }
  212. [TestMethod]
  213. [TestProperty("Type", "Integration")]
  214. public void BasicTestWithRequiredMetadata_WrongTypeConstraint()
  215. {
  216. var catalog = CatalogFactory.CreateDefaultAttributed();
  217. var catalogExportProvider = new CatalogExportProvider(catalog);
  218. catalogExportProvider.SourceProvider = catalogExportProvider;
  219. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithNoFoo", new string[] { "Foo" }, new Type[] { typeof(int) })).Count());
  220. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithFoo", new string[] { "Foo" }, new Type[] { typeof(int) })).Count());
  221. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithFoo", new string[] { "Foo", "Bar" }, new Type[] { typeof(int), typeof(int) })).Count());
  222. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithNoFoo", new string[] { "Foo" }, new Type[] { typeof(int) })).Count());
  223. Assert.AreEqual(0, catalogExportProvider.GetExports(ImportFromContractAndMetadata("MyExporterWithFoo", new string[] { "Foo" }, new Type[] { typeof(int) })).Count());
  224. }
  225. [TestMethod]
  226. [TestProperty("Type", "Integration")]
  227. public void ComponentCatalogResolverGetStaticExport()
  228. {
  229. var catalog = CatalogFactory.CreateDefaultAttributed();
  230. var catalogExportProvider = new CatalogExportProvider(catalog);
  231. catalogExportProvider.SourceProvider = catalogExportProvider;
  232. var exports = catalogExportProvider.GetExports(ImportFromContract("StaticString"));
  233. Assert.AreEqual(1, exports.Count());
  234. Assert.AreEqual("StaticString", exports.First().Value);
  235. }
  236. [TestMethod]
  237. [TestProperty("Type", "Integration")]
  238. public void ComponentCatalogResolverComponentCatalogExportReference()
  239. {
  240. var catalog = CatalogFactory.CreateDefaultAttributed();
  241. var catalogExportProvider = new CatalogExportProvider(catalog);
  242. catalogExportProvider.SourceProvider = catalogExportProvider;
  243. var exports = catalogExportProvider.GetExports(ImportFromContract(AttributedModelServices.GetContractName(typeof(MyExporterWithValidMetadata))));
  244. Assert.AreEqual(1, exports.Count());
  245. var export = exports.First();
  246. Assert.AreEqual("world", export.Metadata["hello"]);
  247. Assert.IsInstanceOfType(export.Value, typeof(MyExporterWithValidMetadata));
  248. }
  249. [TestMethod]
  250. [TestProperty("Type", "Integration")]
  251. public void ValueTypeFromCatalog()
  252. {
  253. var catalog = CatalogFactory.CreateDefaultAttributed();
  254. var container = new CompositionContainer(catalog);
  255. int singletonResult = container.GetExportedValue<int>("{AssemblyCatalogResolver}SingletonValueType");
  256. Assert.AreEqual(17, singletonResult, "expecting value type resolved from catalog");
  257. int factoryResult = container.GetExportedValue<int>("{AssemblyCatalogResolver}FactoryValueType");
  258. Assert.AreEqual(18, factoryResult, "expecting value type resolved from catalog");
  259. }
  260. [Export]
  261. [PartCreationPolicy(CreationPolicy.Any)]
  262. public class CreationPolicyAny
  263. {
  264. }
  265. [TestMethod]
  266. public void CreationPolicyAny_MultipleCallsReturnSameInstance()
  267. {
  268. var catalog = CatalogFactory.CreateAttributed(typeof (CreationPolicyAny));
  269. var provider = new CatalogExportProvider(catalog);
  270. provider.SourceProvider = ContainerFactory.Create();
  271. var export = provider.GetExportedValue<CreationPolicyAny>();
  272. for (int i = 0; i < 5; i++) // 5 is arbitrarily chosen
  273. {
  274. var export1 = provider.GetExportedValue<CreationPolicyAny>();
  275. Assert.AreEqual(export, export1);
  276. }
  277. }
  278. [Export]
  279. [PartCreationPolicy(CreationPolicy.Shared)]
  280. public class CreationPolicyShared
  281. {
  282. }
  283. [TestMethod]
  284. public void CreationPolicyShared_MultipleCallsReturnSameInstance()
  285. {
  286. var catalog = CatalogFactory.CreateAttributed(typeof(CreationPolicyShared));
  287. var provider = new CatalogExportProvider(catalog);
  288. provider.SourceProvider = ContainerFactory.Create();
  289. var export = provider.GetExportedValue<CreationPolicyShared>();
  290. for (int i = 0; i < 5; i++) // 5 is arbitrarily chosen
  291. {
  292. var export1 = provider.GetExportedValue<CreationPolicyShared>();
  293. Assert.AreEqual(export, export1);
  294. }
  295. }
  296. [Export]
  297. [PartCreationPolicy(CreationPolicy.NonShared)]
  298. public class CreationPolicyNonShared
  299. {
  300. }
  301. [TestMethod]
  302. public void CreationPolicyNonShared_MultipleCallsReturnsDifferentInstances()
  303. {
  304. var catalog = CatalogFactory.CreateAttributed(typeof(CreationPolicyNonShared));
  305. var provider = new CatalogExportProvider(catalog);
  306. provider.SourceProvider = ContainerFactory.Create();
  307. List<CreationPolicyNonShared> list = new List<CreationPolicyNonShared>();
  308. var export = provider.GetExportedValue<CreationPolicyNonShared>();
  309. list.Add(export);
  310. for (int i = 0; i < 5; i++) // 5 is arbitrarily chosen
  311. {
  312. export = provider.GetExportedValue<CreationPolicyNonShared>();
  313. CollectionAssert.DoesNotContain(list, export);
  314. list.Add(export);
  315. }
  316. }
  317. [TestMethod]
  318. [WorkItem(684514)]
  319. public void GetExports_NoSourceProvider_ShouldThrowInvalidOperation()
  320. {
  321. var catalog = CatalogFactory.CreateAttributed();
  322. var provider = new CatalogExportProvider(catalog);
  323. ExceptionAssert.Throws<InvalidOperationException>(() =>
  324. provider.GetExports(ImportFromContract("Foo")));
  325. }
  326. [TestMethod]
  327. [TestProperty("Type", "Integration")]
  328. [Ignore]
  329. [WorkItem(561310)]
  330. public void Recomposition_PartDefWithRecomposableImportIsRemoved_ExportsMatchingImportChanged_ShouldNotBeRecomposed()
  331. {
  332. string dependencyContractName = "dependency";
  333. var exportValue = new object();
  334. var exporterPart = PartFactory.CreateExporter(dependencyContractName, exportValue);
  335. var importerPart = PartFactory.CreateImporter(dependencyContractName, true);
  336. var exporterCatalog = CatalogFactory.Create(exporterPart);
  337. var importerCatalog = CatalogFactory.Create(importerPart);
  338. var aggregateCatalog = CatalogFactory.CreateAggregateCatalog(importerCatalog, exporterCatalog);
  339. var provider = new CatalogExportProvider(aggregateCatalog);
  340. provider.SourceProvider = provider;
  341. var exports = provider.GetExports(importerPart.ImportDefinitions.Single());
  342. Assert.AreEqual(exportValue, importerPart.Value, "Importer was not composed");
  343. aggregateCatalog.Catalogs.Remove(importerCatalog);
  344. aggregateCatalog.Catalogs.Remove(exporterCatalog);
  345. Assert.AreEqual(exportValue, importerPart.Value, "Importer was unexpectedly recomposed");
  346. }
  347. [TestMethod]
  348. [TestProperty("Type", "Integration")]
  349. [Ignore]
  350. [WorkItem(561310)]
  351. public void Recomposition_PartDefWithNonRecomposableImportIsRemoved_ExportsMatchingImportChanged_ShouldNotBeRejected()
  352. {
  353. string dependencyContractName = "dependency";
  354. var exportValue = new object();
  355. var exporterPart = PartFactory.CreateExporter(dependencyContractName, exportValue);
  356. var importerPart = PartFactory.CreateImporter(dependencyContractName, false);
  357. var exporterCatalog = CatalogFactory.Create(exporterPart);
  358. var importerCatalog = CatalogFactory.Create(importerPart);
  359. var aggregateCatalog = CatalogFactory.CreateAggregateCatalog(importerCatalog, exporterCatalog);
  360. var provider = new CatalogExportProvider(aggregateCatalog);
  361. provider.SourceProvider = provider;
  362. var exports = provider.GetExports(importerPart.ImportDefinitions.Single());
  363. Assert.AreEqual(exportValue, importerPart.Value, "Importer was not composed");
  364. aggregateCatalog.Catalogs.Remove(importerCatalog);
  365. aggregateCatalog.Catalogs.Remove(exporterCatalog);
  366. Assert.AreEqual(exportValue, importerPart.Value, "Importer was unexpectedly recomposed");
  367. }
  368. [TestMethod]
  369. public void CanBeCollectedAfterDispose()
  370. {
  371. AggregateExportProvider sourceExportProvider = new AggregateExportProvider();
  372. var catalog = new AggregateCatalog(CatalogFactory.CreateDefaultAttributed());
  373. var catalogExportProvider = new CatalogExportProvider(catalog);
  374. catalogExportProvider.SourceProvider = sourceExportProvider;
  375. WeakReference weakCatalogExportProvider = new WeakReference(catalogExportProvider);
  376. catalogExportProvider.Dispose();
  377. catalogExportProvider = null;
  378. GC.Collect();
  379. GC.WaitForPendingFinalizers();
  380. Assert.IsFalse(weakCatalogExportProvider.IsAlive);
  381. GC.KeepAlive(sourceExportProvider);
  382. GC.KeepAlive(catalog);
  383. }
  384. [TestMethod]
  385. public void RemovingAndReAddingMultipleDefinitionsFromCatalog()
  386. {
  387. var fixedParts = new TypeCatalog(typeof(RootMultipleImporter), typeof(ExportedService));
  388. var changingParts = new TypeCatalog(typeof(Exporter1), typeof(Exporter2));
  389. var catalog = new AggregateCatalog();
  390. catalog.Catalogs.Add(fixedParts);
  391. catalog.Catalogs.Add(changingParts);
  392. var catalogExportProvider = new CatalogExportProvider(catalog);
  393. catalogExportProvider.SourceProvider = catalogExportProvider;
  394. var root = catalogExportProvider.GetExport<RootMultipleImporter>().Value;
  395. Assert.AreEqual(2, root.Imports.Length);
  396. catalog.Catalogs.Remove(changingParts);
  397. Assert.AreEqual(0, root.Imports.Length);
  398. catalog.Catalogs.Add(changingParts);
  399. Assert.AreEqual(2, root.Imports.Length);
  400. }
  401. [Export]
  402. public class RootMultipleImporter
  403. {
  404. [ImportMany(AllowRecomposition = true)]
  405. public IExportedInterface[] Imports { get; set; }
  406. }
  407. public interface IExportedInterface
  408. {
  409. }
  410. [Export(typeof(IExportedInterface))]
  411. public class Exporter1 : IExportedInterface
  412. {
  413. [Import]
  414. public ExportedService Service { get; set; }
  415. }
  416. [Export(typeof(IExportedInterface))]
  417. public class Exporter2 : IExportedInterface
  418. {
  419. [Import]
  420. public ExportedService Service { get; set; }
  421. }
  422. [Export]
  423. public class ExportedService
  424. {
  425. }
  426. private static ImportDefinition ImportFromContract(string contractName)
  427. {
  428. return ImportDefinitionFactory.CreateDefault(contractName,
  429. ImportCardinality.ZeroOrMore,
  430. false,
  431. false);
  432. }
  433. private static ImportDefinition ImportFromContractAndMetadata(string contractName, string[] metadataKeys, Type[] metadataValues)
  434. {
  435. Assert.AreEqual(metadataKeys.Length, metadataValues.Length);
  436. Dictionary<string, Type> requiredMetadata = new Dictionary<string, Type>();
  437. for (int i = 0; i < metadataKeys.Length; i++)
  438. {
  439. requiredMetadata.Add(metadataKeys[i], metadataValues[i]);
  440. }
  441. return new ContractBasedImportDefinition(contractName,
  442. (string)null,
  443. requiredMetadata,
  444. ImportCardinality.ZeroOrMore,
  445. false,
  446. false,
  447. CreationPolicy.Any);
  448. }
  449. private static CatalogExportProvider CreateCatalogExportProvider()
  450. {
  451. return CreateCatalogExportProvider(CatalogFactory.Create());
  452. }
  453. private static CatalogExportProvider CreateCatalogExportProvider(params ComposablePartDefinition[] definitions)
  454. {
  455. return CreateCatalogExportProvider(CatalogFactory.Create(definitions));
  456. }
  457. private static CatalogExportProvider CreateCatalogExportProvider(params ComposablePart[] parts)
  458. {
  459. return CreateCatalogExportProvider(CatalogFactory.Create(parts));
  460. }
  461. private static CatalogExportProvider CreateCatalogExportProvider(ComposablePartCatalog catalog)
  462. {
  463. return new CatalogExportProvider(catalog);
  464. }
  465. }
  466. }