2011-11-25 65 views
0

我正在使用MEF在運行時組成多個組件,但是當我使用元數據屬性時,它會使集合中的部件數量加倍。MEF導入正在創建每個部分的兩個實例

當檢查container.ComposeParts我可以看到包含11個實現的IStages的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)) 

進口沿革資料界面

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

任何想法的問題是什麼?

回答

1

想通了

如果你裝飾用出口的部分,StagesMetadata它創建2個部分出口definintions爲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

這是正確的,您提供了兩個相同類型的同一合同的出口。你已經創建了一個自定義的導出屬性('StagesMetadataAttribute'),所以你可以放棄額外的'[Export(typeof(IStages))]'export,你應該很好。另外,如果你這樣做,你可能想重新命名你的自定義導出屬性以更好地表示它的功能,例如'StagesMetadataAttribute' - >'ExportStagesAttribute'。 –

+0

此外,只是爲了個人喜好,我通常用元數據合同裝飾我的出口attrbutes。您不需要這樣做,但它可以很好地提醒您,如果更改元數據合同,則應更新導出屬性以反映它。 –