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