MEF中缺少哪些与IoC容器相同的东西?

bit*_*onk 6 mef ioc-container

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)

Dan*_*ted 3

正如所讨论的,MEF 并不是为了成为 IoC 容器而构建的。然而,它有很多相似之处。如果 MEF 提供的功能足以满足您的 IoC 容器需求,那么您可以继续将其用作 IoC 容器。

虽然 MEF 可能永远无法满足每个人的 IoC 容器需求,但在下一个版本中,我们正在进行更改,我认为这将使其值得更多人使用它作为 IoC 容器。这里是其中的一些:

  • 可以选择禁用拒绝,以便更轻松地诊断您不希望任何内容被拒绝的系统中的错误
  • 约定模型支持允许您注册要导出和导入的类型,而不是在类型本身上添加导出和导入属性。
  • 开放通用支持,因此您可以导出开放通用并导入封闭版本。
  • 更好地支持作用域/分层容器,这可能有助于生命周期管理。

托马斯提到拦截是一个重要特征。我们目前没有计划提供对此开箱即用的支持。 我相信MefContrib确实以 InterceptingCatalog 的形式对此提供了一些支持。