2015-08-25 71 views
3

依賴的收藏我在註冊表中下面的代碼:結構地圖 - 在構造

 Scan(x => 
     { 
      x.Assembly(Assembly.GetExecutingAssembly()); 
      x.AddAllTypesOf<IXmlExtractor>(); 
     }); 

該代碼添加的IXmlExtractor所有實例我組裝的IoC容器。

現在我想在我的類中使用所有找到的實例,但我更傾向於通過構造函數注入,而不是在方法中使用ObjectFactory。希望下面的代碼說明我想要做什麼:

class Engine : IEngine 
{ 
    private readonly ILog _logger; 
    private readonly ICurveConfigRepository _configRepo; 
    private readonly IDataExtractor _dataExtractor; 

    public Engine(ILog logger, 
      ICurveConfigRepository configRepo, 
      IDataExtractor dataExtractor 
      /* SomeCollectionOfIXmlExtractors allExtractors */) 
    { 
     _logger = logger; 
     _configRepo = configRepo; 
     _dataExtractor = dataExtractor; 
    } 

    public void Run(string mode) 
    { 
     _logger.Info(string.Format("About to run retrieve config for '{0}' mode.", mode)); 

     var config = _configRepo.LoadConfig(mode); 

     _logger.Info("Config retrieved, extracting data"); 
     var data = _dataExtractor.GetCurves(config); 

     _logger.Info("Data extracted"); 

     // Foreach IXmlExtractor instance, call .DoStuff(data) with it. 
     // I don't like using ObjectFactory here - see comment in constructor 
     var extractors = ObjectFactory.GetAllInstances<IXmlExtractor>(); 

    } 
} 

希望這是明確的,請評論回來,如果需要進一步解釋。

  • C#4.0
  • StructureMap:2.5.4.0

感謝,

格雷姆

+0

如果有其他人閱讀這篇文章,我遇到以下文章闡述了爲什麼應儘可能避免使用對象工廠(服務定位器):http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti點模式/。換句話說,它隱藏了消費者的依賴關係。 – GinjaNinja

回答

4

您已經正確註冊與容器的所有實例。

Scan(x => 
{ 
    x.Assembly(Assembly.GetExecutingAssembly()); 
    x.AddAllTypesOf<IXmlExtractor>(); 
}); 

所有你需要做的是聲明數組變量和StructureMap會自動照顧構造注射。

class Engine : IEngine 
{ 
    private readonly ILog _logger; 
    private readonly ICurveConfigRepository _configRepo; 
    private readonly IDataExtractor _dataExtractor; 
    private readonly IXmlExtractors[] _allExtractors; 

    public Engine(ILog logger, 
      ICurveConfigRepository configRepo, 
      IDataExtractor dataExtractor 
      IXmlExtractors[] allExtractors) 
    { 
     _logger = logger; 
     _configRepo = configRepo; 
     _dataExtractor = dataExtractor; 
     _allExtractors = allExtractors; 
    } 

    public void Run(string mode) 
    { 
     _logger.Info(string.Format("About to run retrieve config for '{0}' mode.", mode)); 

     var config = _configRepo.LoadConfig(mode); 

     _logger.Info("Config retrieved, extracting data"); 
     var data = _dataExtractor.GetCurves(config); 

     _logger.Info("Data extracted"); 

     // Use extractors... 
     foreach (var extractor in _allExtractors) 
     { 
      extractor.DoStuff(data); 
     } 
    } 
} 
+0

完美無缺 - 謝謝。 – GinjaNinja