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
任何想法的問題是什麼?
這是正確的,您提供了兩個相同類型的同一合同的出口。你已經創建了一個自定義的導出屬性('StagesMetadataAttribute'),所以你可以放棄額外的'[Export(typeof(IStages))]'export,你應該很好。另外,如果你這樣做,你可能想重新命名你的自定義導出屬性以更好地表示它的功能,例如'StagesMetadataAttribute' - >'ExportStagesAttribute'。 –
此外,只是爲了個人喜好,我通常用元數據合同裝飾我的出口attrbutes。您不需要這樣做,但它可以很好地提醒您,如果更改元數據合同,則應更新導出屬性以反映它。 –