结构图 - 构造函数中的依赖集合

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>();

    }
}

希望这很清楚,如果需要进一步解释,请回复。

谢谢,

格雷姆

您已经正确注册了容器中的所有实例。

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);
        }
    }
}