有人能解釋一下SatisfyImportsOnce
和ComposeParts
之間的區別,以及爲什麼一個人可以在另一個人不工作的地方工作?SatisfyImportsOnce vs ComposeParts
具體來說,我有一個MVC Web應用程序,我正在使用MEF。以下是一些代碼(來自該應用程序),當我使用SatisfyImportsOnce
時工作,但不使用ComposeParts
時。我的理解是,ComposeParts
從屬性對象數組中創建可組合部分,並將它們組合到指定的組合容器中,並且通過使用指定的組合服務來組合指定的部分。對我簡單的猴子大腦來說,即使英語不同,它們在語義上也是一樣的。兩者都使用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;
}
}
謝謝,這是一個很好的答案。 – Peter