2011-11-25 5 views
0

MEFを使用して実行時に多数のコンポーネントを作成していますが、メタデータ属性を使用すると、コレクションの部品数が倍になります。MEFインポートはすべての部品の2つのインスタンスを作成しています

container.ComposePartsをチェックすると、IStagesの11実装を含むdllが一度読み込まれ、11部のみが表示されますが、私有プロパティステージがIEnumerable(IStages、IStagesMetadata ))インスタンス数は22に倍増します。コレクションをループすると、メタデータのIDによって複製されていることがわかります。

エクスポートまたはインポートでMetadata属性を使用しない場合、予想される11の部分が得られます。

エクスポート

Imports System.ComponentModel.Composition 

<MetadataAttribute(), AttributeUsage(AttributeTargets.Class, AllowMultiple:=False)> 
Public Class StagesMetadataAttribute 
    Inherits ExportAttribute 

    Public Property StageID As Byte 
    Public Property Version As String 

    Public Sub New() 
     MyBase.New(GetType(IStages)) 
    End Sub 

End Class 

その例

Imports System.ComponentModel.Composition 
Imports VFRAME.QUALITY.GOODSIN.ESCALATE.INTERFACES 

<Export(GetType(IStages))> 
<StagesMetadata(StageID:=1, Version:="v1.0.0.0")> 
Public Class Stage1 
    Implements IStages 

    Public Function ProcessEscalation(failure As InspectionFaultsModel) As InspectionFaultsModel Implements IStages.ProcessEscalation 
     Return Nothing 
    End Function 

End Class 

インポート側コンストラクタ

Using catelog As New DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory) 
    Using container As New CompositionContainer(catelog) 
     Try 
      container.ComposeParts(Me) 
     Catch ex As CompositionException 
      _compositionComplete = False 
     End Try 
    End Using 
End Using 

ImportMany

<ImportMany()> 
Private Property Stages As IEnumerable(Of Lazy(Of IStages, IStagesMetadata)) 
属性

インポートmetadateインタフェース

Public Interface IStagesMetadata 
    ReadOnly Property StageID As Byte 
    ReadOnly Property Version As String 
End Interface 

問題が何であるか任意のアイデア?

答えて

1

あなたはエクスポートおよびStagesMetadataで一部を飾る場合StagesMetadataAttributeがExportAttribute

<Export(GetType(IStages))> 
<StagesMetadata(StageID:=1, Version:="v1.0.0.0")> 
Public Class Stage1 
    Implements IStages 

    Public Function ProcessEscalation(failure As InspectionFaultsModel) As InspectionFaultsModel Implements IStages.ProcessEscalation 
     Return Nothing 
    End Function 

End Class 

Theresの愚かさのためノー会計から継承するとして、それは一部に2輸出definintionsを作成

をそれを考え出しました。

+2

同じタイプの同じ契約の2つのエクスポートを提供していたのは正しいです。あなたはすでにカスタムのエクスポート属性( 'StagesMetadataAttribute')を作成していますので、追加の[Export(typeof(IStages))]エクスポートを削除してください。また、それを行う場合は、カスタムエクスポート属性の名前を変更して、その機能をよりよく表現することができます。 'StagesMetadataAttribute' - >' ExportStagesAttribute'です。 –

+0

また、個人的な好みのために、私は通常、メタデータコントラクトでエクスポートアトリビュートを飾ります。あなたはする必要はありませんが、メタデータコントラクトを変更した場合は、エクスポート属性も更新され、それを反映する必要があります。 –

関連する問題