Structuremap, конструктор, который берет список плагинов

Например:

svn propset svn:mime-type image/png foo.png
12
задан Mikael Östberg 3 December 2012 в 13:29
поделиться

4 ответа

Если вы хотите, чтобы были внедрены все конкретные экземпляры типа, вы ДОЛЖНЫ объявить параметр как массив. Вы можете решить вашу проблему, изменив свой конструктор на:

public WriterMerger(IWriter[] writers)

Имейте в виду, что инструменты очистки кода, такие как ReSharper, могут выделить массив в вашем конструкторе и предложить вам заменить его на IEnumerable, если это все, что требуется для вашего WriterMerger. Однако эти инструменты не осведомлены о требовании StructureMap использовать массив, поэтому вы должны игнорировать его.

Вам также может быть интересно узнать, что вы можете автоматически регистрировать все свои IWriters вместо их явного перечисления. Просто измените конфигурацию контейнера на:

StructureMap.ObjectFactory.Initialize(x =>
{
    x.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.AddAllTypesOf<IWriter>();
    });
});

Существует ряд различных параметров сканирования, которые позволяют сканировать различные сборки, исключать определенные типы и т. Д.

10
ответ дан 2 December 2019 в 04:53
поделиться

Я продублировал вашу проблему, и я считаю, что ваш код будет работать, если вы измените свой класс потребления IWriter на ctor, который принимает массив IWriter.

public class WriterMerger {  public WriterMerger(IWriter[] writers) }

Джош прав, рекомендуя лучший способ зарегистрировать все типы IWriter с помощью StructureMap. Сканеры FTW.

2
ответ дан 2 December 2019 в 04:53
поделиться

Я думаю, это говорит вам о том, что вам нужно определить один из этих IWriter по умолчанию . Представьте, что у другого класса есть следующий конструктор:

public class Test{
  public Test(IWriter writer){}
}

Без IWriter по умолчанию он не знал бы, какой писатель назначить. Поэтому вам, вероятно, нужно указать, какой из них используется по умолчанию, даже если вы никогда его не использовали. См. Этот пост:

В чем разница между AddConcreteType и TheDefaultIsConcreteType в StructureMap?

1
ответ дан 2 December 2019 в 04:53
поделиться

На самом деле это можно сделать, не меняя конструктор

Измените конфигурацию контейнера на:

StructureMap.ObjectFactory.Initialize(x =>
{
    x.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.AddAllTypesOf<IWriter>();
    });
    x.ForRequestedType<IEnumerable<IWriter>>()
        .TheDefault.Is.ConstructedBy(x => ObjectFactory.GetAllInstances<IWriter>());
});
18
ответ дан 2 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: