结构图-构造函数中的依赖项集合 [英] Structure Map - Collection of Dependencies in Constructor

查看:92
本文介绍了结构图-构造函数中的依赖项集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的注册表中有以下代码:

I have the following code in my Registry:

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

此代码将 IXmlExtractor 的所有实例添加到我的程序集到IoC容器。

This code adds all instances of IXmlExtractor in my assembly to the IoC container.

现在,我想使用类中所有找到的实例,但是我更喜欢通过构造函数注入而不是使用方法中的ObjectFactory 。希望下面的代码说明我想做什么:

Now I want to use all found instances in my class, but I prefer to inject via constructor than to use ObjectFactory in a method. Hopefully code below illustrates what I want to do:

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

    }
}

希望这很清楚,请发表评论

Hopefully this is clear, please comment back if further explanation is required.


  • C#:4.0

  • StructureMap:2.5.4.0
  • C#: 4.0
  • StructureMap: 2.5.4.0

谢谢

Graeme

推荐答案

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

You have already correctly registered all instances with the container.

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

您需要做的就是声明一个数组变量和 StructureMap 将自动处理构造函数注入。

All you need to do is declare an array variable and StructureMap will take care of the constructor injection automatically.

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

这篇关于结构图-构造函数中的依赖项集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆