MEF容器层次结构和GetExports<;T>;
本文关键字:lt gt GetExports 层次结构 MEF | 更新日期: 2023-09-27 18:21:32
我正在使用容器层次结构来控制IDisposable部件的使用寿命。子容器附着到包含非共享零件的已筛选目录。下面是一个代码片段:
[Export(typeof(ITest)), PartCreationPolicy(CreationPolicy.NonShared)]
class Test : ITest, IDisposable
{
public void Dispose() {}
}
public interface ITest {}
class Program
{
static void Main()
{
// parent container to hold shared disposable parts
var cat = new AssemblyCatalog(typeof(Program).Assembly);
var parent = new CompositionContainer(cat);
// child container to hold non-shared disposable parts
var nsCat = CreateNonSharedPartCatalog(cat);
var child = new CompositionContainer(nsCat, parent);
// no cardinality mismatch exception: exactly one export found
var exp = child.GetExport<ITest>();
// lazy exports: count == 2 -- why?
var exports = child.GetExports<ITest>();
Console.WriteLine("Exports count = {0}", exports.Count());
}
static ComposablePartCatalog
CreateNonSharedPartCatalog(ComposablePartCatalog cat)
{
return new FilteredCatalog(cat,
def => def.Metadata.ContainsKey(
CompositionConstants.PartCreationPolicyMetadataName) &&
((CreationPolicy)def.Metadata[
CompositionConstants.PartCreationPolicyMetadataName]) ==
CreationPolicy.NonShared);
}
}
(FilteredCatalog类与MEF文档中提到的类相同)。
GetExport不会抛出基数不匹配异常,这表明不存在歧义(只找到一个导出)。但令我惊讶的是,GetExports()返回了2个惰性导出,而不是1个。
我这是个bug还是这种行为是故意的?如何设置子容器,以便GetExports在此示例中返回一个导出?
这是MEF中使用过滤目录的容器层次结构的已知限制。我相信(但现在不能确认)设置导入来源:
[ImportMany(Source=ImportSource.Local)]
public IEnumerable<ITest> Tests { get; set; }
应该提供您想要的行为(但仅在MEF2/.NET 4.5开发者预览版中)。
希望这能有所帮助!