1 out of 1 rated this helpful - Rate this topic

CompositionContainer Class

Updated: December 2010

Manages the composition of parts.

System.Object
  System.ComponentModel.Composition.Hosting.ExportProvider
    System.ComponentModel.Composition.Hosting.CompositionContainer

Namespace:  System.ComponentModel.Composition.Hosting
Assembly:  System.ComponentModel.Composition (in System.ComponentModel.Composition.dll)
public class CompositionContainer : ExportProvider, 
	ICompositionService, IDisposable

The CompositionContainer type exposes the following members.

  Name Description
Public method Supported by Portable Class Library CompositionContainer() Initializes a new instance of the CompositionContainer class.
Public method Supported by Portable Class Library CompositionContainer(ExportProvider[]) Initializes a new instance of the CompositionContainer class with the specified export providers.
Public method Supported by Portable Class Library CompositionContainer(ComposablePartCatalog, ExportProvider[]) Initializes a new instance of the CompositionContainer class with the specified catalog and export providers.
Public method Supported by Portable Class Library CompositionContainer(ComposablePartCatalog, Boolean, ExportProvider[]) Initializes a new instance of the CompositionContainer class with the specified catalog, thread-safe mode, and export providers.
Top
  Name Description
Public property Supported by Portable Class Library Catalog Gets the ComposablePartCatalog that provides the container access to Export objects.
Public property Supported by Portable Class Library Providers Gets the export providers that provide the container access to additional ComposablePartCatalog objects.
Top
  Name Description
Public method Supported by Portable Class Library Compose Adds or removes the parts in the specified CompositionBatch from the container and executes composition.
Public method Supported by Portable Class Library Dispose() Releases all resources used by the current instance of the CompositionContainer class.
Protected method Supported by Portable Class Library Dispose(Boolean) Releases the unmanaged resources used by the CompositionContainer and optionally releases the managed resources.
Public method Supported by Portable Class Library Equals(Object) Determines whether the specified Object is equal to the current Object. (Inherited from Object.)
Protected method Supported by Portable Class Library Finalize Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from Object.)
Public method GetExport<T>() Returns the export with the contract name derived from the specified type parameter. If there is not exactly one matching export, an exception is thrown. (Inherited from ExportProvider.)
Public method GetExport<T>(String) Returns the export with the specified contract name. If there is not exactly one matching export, an exception is thrown. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExport<T, TMetadataView>() Returns the export with the contract name derived from the specified type parameter. If there is not exactly one matching export, an exception is thrown. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExport<T, TMetadataView>(String) Returns the export with the specified contract name. If there is not exactly one matching export, an exception is thrown. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExportedValue<T>() Returns the exported object with the contract name derived from the specified type parameter. If there is not exactly one matching exported object, an exception is thrown. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExportedValue<T>(String) Returns the exported object with the specified contract name. If there is not exactly one matching exported object, an exception is thrown. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExportedValueOrDefault<T>() Gets the exported object with the contract name derived from the specified type parameter or the default value for the specified type, or throws an exception if there is more than one matching exported object. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExportedValueOrDefault<T>(String) Gets the exported object with the specified contract name or the default value for the specified type, or throws an exception if there is more than one matching exported object. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExportedValues<T>() Gets all the exported objects with the contract name derived from the specified type parameter. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExportedValues<T>(String) Gets all the exported objects with the specified contract name. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExports(ImportDefinition) Gets all exports that match the conditions of the specified import definition. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExports(ImportDefinition, AtomicComposition) Gets all exports that match the conditions of the specified import definition and composition. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExports(Type, Type, String) Gets all the exports with the specified contract name. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExports<T>() Gets all the exports with the contract name derived from the specified type parameter. (Inherited from ExportProvider.)
Public method GetExports<T>(String) Gets all the exports with the specified contract name. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library GetExports<T, TMetadataView>(String) Gets all the exports with the specified contract name. (Inherited from ExportProvider.)
Protected method Supported by Portable Class Library GetExportsCore Returns a collection of all exports that match the conditions in the specified ImportDefinition object. (Overrides ExportProvider.GetExportsCore(ImportDefinition, AtomicComposition).)
Public method Supported by Portable Class Library GetHashCode Serves as a hash function for a particular type. (Inherited from Object.)
Public method Supported by Portable Class Library GetType Gets the Type of the current instance. (Inherited from Object.)
Protected method Supported by Portable Class Library MemberwiseClone Creates a shallow copy of the current Object. (Inherited from Object.)
Protected method Supported by Portable Class Library OnExportsChanged Raises the ExportsChanged event. (Inherited from ExportProvider.)
Protected method Supported by Portable Class Library OnExportsChanging Raises the ExportsChanging event. (Inherited from ExportProvider.)
Public method Supported by Portable Class Library ReleaseExport(Export) Releases the specified Export object from the CompositionContainer.
Public method Supported by Portable Class Library ReleaseExport<T>(Lazy<T>) Removes the specified export from composition and releases its resources if possible.
Public method Supported by Portable Class Library ReleaseExports(IEnumerable<Export>) Releases a set of Export objects from the CompositionContainer.
Public method Supported by Portable Class Library ReleaseExports<T>(IEnumerable<Lazy<T>>) Removes a collection of exports from composition and releases their resources if possible.
Public method Supported by Portable Class Library ReleaseExports<T, TMetadataView>(IEnumerable<Lazy<T, TMetadataView>>) Removes a collection of exports from composition and releases their resources if possible.
Public method Supported by Portable Class Library SatisfyImportsOnce Satisfies the imports of the specified ComposablePart object without registering it for recomposition.
Public method Supported by Portable Class Library ToString Returns a string that represents the current object. (Inherited from Object.)
Public method Supported by Portable Class Library TryGetExports Gets all the exports that match the conditions of the specified import. (Inherited from ExportProvider.)
Top
  Name Description
Public event Supported by Portable Class Library ExportsChanged Occurs when the exports in the ExportProvider change. (Inherited from ExportProvider.)
Public event Supported by Portable Class Library ExportsChanging Occurs when the provided exports are changing. (Inherited from ExportProvider.)
Top
  Name Description
Public Extension Method Supported by Portable Class Library ComposeExportedValue<T>(T) Overloaded. Creates a part from the specified value and composes it in the specified composition container. (Defined by AttributedModelServices.)
Public Extension Method Supported by Portable Class Library ComposeExportedValue<T>(String, T) Overloaded. Creates a part from the specified object under the specified contract name and composes it in the specified composition container. (Defined by AttributedModelServices.)
Public Extension Method Supported by Portable Class Library ComposeParts Creates composable parts from an array of attributed objects and composes them in the specified composition container. (Defined by AttributedModelServices.)
Public Extension Method Supported by Portable Class Library SatisfyImportsOnce Composes the specified part by using the specified composition service, with recomposition disabled. (Defined by AttributedModelServices.)
Top

A CompositionContainer object serves two major purposes in an application. First, it keeps track of which parts are available for composition and what their dependencies are, and performs composition whenever the set of available parts changes. Second, it provides the methods by which the application gets instances of composed parts or fills the dependencies of a composable part.

Parts can be made available to the container either directly or through the Catalog property. All the parts discoverable in this ComposablePartCatalog are available to the container to fulfill imports, along with any parts added directly.

The Compose method allows instantiated parts to be added to an existing container. Assuming composition is successful, these parts will have their imports filled with parts retrieved from the container, and their exports will be available to other parts. Imports marked as recomposable will be registered for recomposition.

The SatisfyImportsOnce method allows a part to have its imports filled without being added to the container. If the composition is successful, the part's imports will be filled, but the part's exports will not be available to other parts and no imports will be registered for recomposition.

CompositionContainer objects should always be disposed. When the Dispose method is called, the CompositionContainer object also disposes all the parts that it has created.

A CompositionContainer object that can be accessed from multiple threads must be constructed with the isThreadSafe parameter set to true, using the CompositionContainer constructor. Performance will be slightly slower when isThreadSafe is true, so we recommend that you set this parameter to false in single-threaded scenarios. The default is false.

Caution note Caution

A CompositionContainer should never import itself, or a part that has a reference to it. Such a reference could allow an untrusted part to gain access all the parts in the container.

In the following example, a CompositionContainer object is initialized with a catalog and is used to fill the imports of a part. This example uses the Attributed Programming Model.


[Export]
class MyAddin
{
    public String myData { get { return "The data!"; } }
}

class MyProgram
{
    [Import]
    public MyAddin myAddin { get; set; }
}


class Program
{
    static void Main(string[] args)
    {
        AggregateCatalog catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(typeof(MyAddin).Assembly));
        CompositionContainer _container = new CompositionContainer(catalog);
        MyProgram myProgram = new MyProgram();
        _container.SatisfyImportsOnce(myProgram);
        Console.WriteLine(myProgram.myAddin.myData);
        Console.ReadLine();

        _container.Dispose();
    }
}


.NET Framework

Supported in: 4

.NET Framework Client Profile

Supported in: 4

Portable Class Library

Supported in: Portable Class Library

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Date

History

Reason

December 2010

Added note about not including self-reference.

Content bug fix.

Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
Error in C# code sample
.SatisfyImportsOnce() doesn't take an object as a parameter - it takes a ComposablePart instance.

--larsw

--AttributedModelServices provides a handy extension method that takes any attributed part as an Object, which is what is used here. (djangow, MSDG)
Constructor actually does composition
It should be more clear that the constructor of the Composition container actually does composition of the parts in the catalogs that are passed in. In other words, as soon as the container is created you can start to parts from it, you dont have to call Compose() first. It would also be useful with a sample where the "root" or "shell" does not have a reference to the container or calls ComposeParts(this), but instead is declared as an export and initialized by the container [by means of some kind of bootstrapper]

--Composition doesn't occur only in the constructor of the composition container, but rather whenever the contents of the container change. So whenever you add, remove, or otherwise alter the available parts, you can see changes in any recomposable parts, and any new parts obtained will reflect the new composition. We'll try to make that clearer in the remarks, thanks! (djangow, MSDG)