MEF 不是 IoC 容器.但它似乎几乎是一个IoC容器.似乎我可以很容易地使MEF表现得像IoC容器(见下面的例子),并且没有太多的缺失使MEF成为一个完整的IoC容器.
MEF中缺少哪些实际功能,StrucureMap,Unity等必须达到标准?
你认为,这个特殊的要求有意义吗?
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Primitives;
using System.Linq;
...
private CompositionContainer container;
public void Configure()
{
container = CompositionHost.Initialize(
new AggregateCatalog(
AssemblySource.Instance.Select(
x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()));
var batch = new CompositionBatch();
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue(container);
container.Compose(batch);
}
Run Code Online (Sandbox Code Playgroud)
正如所讨论的,MEF 并不是为了成为 IoC 容器而构建的。然而,它有很多相似之处。如果 MEF 提供的功能足以满足您的 IoC 容器需求,那么您可以继续将其用作 IoC 容器。
虽然 MEF 可能永远无法满足每个人的 IoC 容器需求,但在下一个版本中,我们正在进行更改,我认为这将使其值得更多人使用它作为 IoC 容器。这里是其中的一些:
托马斯提到拦截是一个重要特征。我们目前没有计划提供对此开箱即用的支持。 我相信MefContrib确实以 InterceptingCatalog 的形式对此提供了一些支持。