Search code examples
.netvb.netextension-methodsmef.net-4.5

MEF CompositionContainer Missing ComposeParts Extension method


I am trying to abstract away the MEF composition of parts into a class library class but I am having problems in .Net4.5 RC as the ComposeParts Extension method is not available in the class library CompositionContainer

Am I doing something wrong or perhaps missing a reference?

WCF Service Class Working Container

<Import(GetType(IGenericModelFactory))>
Public Property ModelFactory As IGenericModelFactory

Private _mefContainer As CompositionContainer
Private _catelog As DirectoryCatalog

Public Sub New()
    _catelog = New DirectoryCatalog(".")
    _mefContainer = New CompositionContainer(_catelog)
    _mefContainer.ComposeParts(Me)
End Sub

Class Library - Missing ComposeParts method

Imports System.ComponentModel.Composition.Hosting

Namespace Core.Composition

    Public Class CompositionBuilder
        Implements IComposeObjects

        Public Function CreateContainer() As CompositionContainer Implements IComposeObjects.CreateContainer
            Return Activator.CreateInstance(Of CompositionContainer)()
        End Function

        Public Sub ComposeFromDirectory(directory As String, compositionRoot As Object) Implements IComposeObjects.ComposeFromDirectory

            Dim catelog As DirectoryCatalog = Activator.CreateInstance(GetType(DirectoryCatalog), directory)
            Dim mefContainer As CompositionContainer = Activator.CreateInstance(GetType(CompositionContainer), catelog)
            mefContainer.Composeparts(compositionRoot)

        End Sub

    End Class

End Namespace

enter image description here


Solution

  • Looks like you have to include the System.ComponentModel.Composition namespace

    Imports System.ComponentModel.Composition.Hosting
    Imports System.ComponentModel.Composition
    
    Namespace Core.Composition
    
        Public Class CompositionBuilder
            Implements IComposeObjects
    
            Public Function CreateContainer() As CompositionContainer Implements IComposeObjects.CreateContainer
                Return Activator.CreateInstance(Of CompositionContainer)()
            End Function
    
            Public Sub ComposeFromDirectory(directory As String, compositionRoot As Object) Implements IComposeObjects.ComposeFromDirectory
    
                Dim catelog As DirectoryCatalog = Activator.CreateInstance(GetType(DirectoryCatalog), directory)
                Dim mefContainer As CompositionContainer = Activator.CreateInstance(GetType(CompositionContainer), catelog)
                mefContainer.ComposeParts(compositionRoot)
    
            End Sub
    
        End Class
    
    End Namespace