【发布时间】:2011-06-21 01:12:48
【问题描述】:
有人能解释一下SatisfyImportsOnce 和ComposeParts 之间的区别吗?为什么一个可以工作而另一个不能工作?
具体来说,我有一个使用 MEF 的 MVC Web 应用程序。下面是一些代码(来自该应用程序),在我使用 SatisfyImportsOnce 时有效,但在我使用 ComposeParts 时无效。我的理解是ComposeParts 从属性对象数组中创建可组合部分,并将它们组合在指定的组合容器中,SatisfyImportsOnce 使用指定的组合服务组合指定的部分。对于我简单的猴子大脑来说,即使英语不同,它们在语义上也是相同的。两者都使用CompositionContainer 在导入目标处吐出导出的类型。
public class FormPartCustomatorFactory
{
[ImportMany(typeof(ICustomRenderer), AllowRecomposition = true)]
private readonly List<Lazy<ICustomRenderer, ICustomRendererMetaData>> _rendererImports = new List<Lazy<ICustomRenderer, ICustomRendererMetaData>>();
private readonly Dictionary<string, Lazy<ICustomRenderer, ICustomRendererMetaData>> _renderers;
public static readonly FormPartCustomatorFactory Instance = new FormPartCustomatorFactory();
static CompositionContainer _container;
private FormPartCustomatorFactory()
{
using (var catalog = new DirectoryCatalog(HttpRuntime.BinDirectory, "*.dll"))
{
_container = new CompositionContainer(catalog);
_container.SatisfyImportsOnce(this); // <- Works
// _container.ComposeParts(this); // DOESN'T Work
_renderers = _rendererImports.ToDictionary(q => q.Metadata.Name, q => q);
}
}
~FormPartCustomatorFactory()
{
_container.Dispose();
}
public static ICustomRenderer Find(string name)
{
return Instance._renderers[name].Value;
}
}
【问题讨论】: