【发布时间】:2011-11-25 10:29:11
【问题描述】:
我在运行时使用 MEF 组合多个组件,但是当我使用元数据属性时,它会使集合中的部件数量增加一倍。
在检查 container.ComposeParts 时,我可以看到包含 11 个 IStages 实现的 dll 被加载一次,并且只出现了所需的 11 个部分,但是当它将私有属性阶段解析为 IEnumerable(Of Lazy(Of IStages, IStagesMetadata) ) 实例的数量翻了一番,达到 22。循环遍历集合我可以看到它们与元数据中的 ID 重复。
如果我不在导出或导入上使用元数据属性,那么我会得到预期的 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()>
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
知道问题出在哪里吗?
【问题讨论】: