Я использую MEF для составления ряда компонентов во время выполнения, но когда я использую атрибут метаданных, он удваивает количество частей в коллекции.
При проверке container.ComposeParts я вижу, что dll, содержащая 11 реализаций IStages, загружается один раз, и появляется только требуемая 11 часть, но когда она разрешает этапы частного свойства как IEnumerable (Of Lazy (Of IStages, IStagesMetadata) ) количество экземпляров удваивается до 22. При просмотре коллекций я вижу, что они дублируются идентификатором в метаданных.
Если я не использую атрибут метаданных при экспорте или импорте, я получу ожидаемые 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))
Импорт интерфейса метаданных
Public Interface IStagesMetadata
ReadOnly Property StageID As Byte
ReadOnly Property Version As String
End Interface
Есть идеи, в чем проблема?