2009-05-05 76 views
2

我正在尝试为MEF导出使用共享部分创建策略。然而,它并没有像我想的那样工作。我在应用程序中做了两次构图,并且每次都获得对象的新副本。我已经通过向对象实例添加实例计数器证明了这一点,并在调试中运行它。事实上,我第二次做的组成,我得到了FakeAutocompleteRepository的新副本instCount = 2,出口部分包含MEF创建策略

[PartCreationPolicy(CreationPolicy.Shared)] 
[Export(typeof(IAutocompleteRepository))] 
[ExportMetadata("IsTesting", "True")] 
class FakeAutocompleteRepository : IAutocompleteRepository 
{ ... } 

有一些窍门能让同一个实例subsiquent请求?在情况下,它是什么成分时,我这样做是我正在做的是

var catalog = new AggregateCatalog(); 
       catalog.Catalogs.Add(new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly())); 
       catalog.Catalogs.Add(new DirectoryCatalog(".")); 
       var container = new CompositionContainer(catalog); 
       var batch = new CompositionBatch(); 
       batch.AddPart(this); 
       container.Compose(batch); 


       if (null != ConfigurationSettings.AppSettings["IsTesting"] && bool.Parse(ConfigurationSettings.AppSettings["IsTesting"])) 
        repository = container.GetExports<IAutocompleteRepository>().Where(expDef => expDef.Metadata.Keys.Contains("IsTesting")).Single().GetExportedObject(); 

基本上我试图在测试过程中强制使用特殊的成分。如果你对单元测试这些组合有更好的想法,那么我就会全神贯注。

回答

3

我没有在您的代码中看到任何会导致创建多个部分的任何内容。您是否为每个作品创建了不同的容器?如果你是,那就是你得到不同实例的原因。

至于如何结合组成和单位测试一般,有一些讨论这here

+0

我完全在每次创建一个新的容器。有没有办法查询活动容器,或者应该在某处创建每个应用程序实例? – stimms 2009-05-05 13:47:02

2

我为单元测试做的是避免组合。举例来说(我使用WPF和MVVM这里),让我们说你要测试的这款视图模型:

[Export("/MyViewModel")] 
public class MyViewModel 
{ 
    [ImportingConstructor] 
    public MyViewModel(
     [Import("/Services/LoggingService")] ILoggingService l) 
    { 
     logger = l; 
    } 

    private ILoggingService logger { get; set; } 

    /* ... */ 
} 

我不想每次我做单元测试的时间来实例化全面的日志服务,所以我有一个实现ILoggingService的MockLoggingService类,它只是吞下所有的日志消息,(或者检查是否正在生成正确的消息,如果你在意的话)。然后我可以在我的单元测试中做到这一点:

MyViewModel target = new MyViewModel(new MockLoggingService());