MEFインポートは、すべてのパートの2つのインスタンスを作成しています

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

Container.ComposePartsをチェックすると、IStagesの11実装を含むdllは一度ロードされ、必要なのは11部しか表示されませんが、IEnumerable(IStages、IStagesMetadataの)IEnumerableとしてPrivate Property Stagesを解決すると、インスタンスの数は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



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


Private Property Stages As IEnumerable(Of Lazy(Of IStages, IStagesMetadata))

メタデータインタフェースのインポート

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

何が問題なのか?

0

1 答え

理解した

ExportおよびStagesMetadataを使用してパーツを飾る場合、StagesMetadataAttributeがExportAttributeから継承するため、パーツに2つのエクスポート定義が作成されます



Public Class Stage1
    Implements IStages

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

End Class

Theresは愚かさを説明しない。

1
追加された
同じタイプの同じ契約の2つの輸出を提供していたのは正しいです。カスタムエクスポート属性( StagesMetadataAttribute )を既に作成しているので、追加の [エクスポート(typeof(IStages))] エクスポートを削除して、 。また、それを行う場合は、カスタムエクスポート属性の名前を変更して、その機能をよりよく表現することができます。 StagesMetadataAttribute - > ExportStagesAttribute をクリックします。
追加された 著者 Matthew Abbott,
また、個人的な好みのために、私は通常、メタデータコントラクトでエクスポートアトリビュートを飾ります。あなたはする必要はありませんが、メタデータコントラクトを変更した場合は、エクスポート属性も更新されて反映されるべきであることを忘れないでください。
追加された 著者 Matthew Abbott,