/// <summary> /// Initializes a new instance. /// </summary> /// <param name="xml"></param> /// <param name="catalog"></param> /// <param name="exports"></param> Document( Func<Document, XDocument> xml, ComposablePartCatalog catalog, ExportProvider exports) { Contract.Requires<ArgumentNullException>(xml != null); // configure composition this.configuration = GetConfiguration(catalog, exports); this.container = new CompositionContainer(configuration.HostCatalog, true, new CompositionContainer(configuration.GlobalCatalog, true, configuration.Exports)); this.container.GetExportedValue<DocumentEnvironment>().SetHost(this); // required services this.invoker = container.GetExportedValue<IInvoker>(); this.trace = container.GetExportedValue<ITraceService>(); // initialize xml this.xml = xml(this); this.xml.AddAnnotation(this); // parallel initialization of common interfaces Parallel.ForEach(this.xml.DescendantNodesAndSelf(), i => { Enumerable.Empty<object>() .Concat(i.Interfaces<IOnInit>()) .Concat(i.Interfaces<IOnLoad>()) .ToLinkedList(); }); // initial invocation entry this.invoker.Invoke(() => { }); }
/// <summary> /// Implements the getter for Default. /// </summary> /// <returns></returns> static CompositionConfiguration GetDefault() { if (defaultCompositionConfiguration == null) lock (sync) if (defaultCompositionConfiguration == null) return defaultCompositionConfiguration = new CompositionConfiguration( CompositionUtil.DefaultGlobalCatalog, CompositionUtil.DefaultHostCatalog, CompositionUtil.DefaultObjectCatalog, new CompositionContainer()); return defaultCompositionConfiguration; }