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