结构图 - 构造函数中的依赖集合
Structure Map - Collection of Dependencies in Constructor
我的注册表中有以下代码:
Scan(x =>
{
x.Assembly(Assembly.GetExecutingAssembly());
x.AddAllTypesOf<IXmlExtractor>();
});
此代码将我程序集中 IXmlExtractor
的所有实例添加到 IoC 容器。
现在我想在 class 中使用所有找到的实例,但我更喜欢通过构造函数注入而不是在方法中使用 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
- 结构图:2.5.4.0
谢谢,
格雷姆
您已经正确注册了容器中的所有实例。
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);
}
}
}
我的注册表中有以下代码:
Scan(x =>
{
x.Assembly(Assembly.GetExecutingAssembly());
x.AddAllTypesOf<IXmlExtractor>();
});
此代码将我程序集中 IXmlExtractor
的所有实例添加到 IoC 容器。
现在我想在 class 中使用所有找到的实例,但我更喜欢通过构造函数注入而不是在方法中使用 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
- 结构图:2.5.4.0
谢谢,
格雷姆
您已经正确注册了容器中的所有实例。
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);
}
}
}