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。您不需要这样做,但它可以很好地提醒您,如果更改元数据合同,则应更新导出属性以反映它。 –