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
問題が何であるか任意のアイデア?
同じタイプの同じ契約の2つのエクスポートを提供していたのは正しいです。あなたはすでにカスタムのエクスポート属性( 'StagesMetadataAttribute')を作成していますので、追加の[Export(typeof(IStages))]エクスポートを削除してください。また、それを行う場合は、カスタムエクスポート属性の名前を変更して、その機能をよりよく表現することができます。 'StagesMetadataAttribute' - >' ExportStagesAttribute'です。 –
また、個人的な好みのために、私は通常、メタデータコントラクトでエクスポートアトリビュートを飾ります。あなたはする必要はありませんが、メタデータコントラクトを変更した場合は、エクスポート属性も更新され、それを反映する必要があります。 –