MEF импорт создает два экземпляра каждой части - PullRequest
0 голосов
/ 25 ноября 2011

Я использую 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

Есть идеи, в чем проблема?

1 Ответ

1 голос
/ 25 ноября 2011

Разобрался с этим

Если вы украсили деталь с помощью Export и StagesMetadata, она создаст 2 определения экспорта для детали, поскольку 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

Нет глупости.

...