Как установить аргумент конструктора по умолчанию в null с StructureMap? - PullRequest
2 голосов
/ 07 октября 2010

Класс имеет уникальный конструктор, принимающий IMyInterface в качестве аргумента.Если я определю конкретный тип IMyInterface и зарегистрирую его в StructureMap, то проблем не будет, и мой класс можно будет создать с этим конкретным типом.

Однако в некоторых случаях конкретный тип не будет зарегистрирован.В этом случае я хотел бы получить значение NULL для параметра IMyInterface.Вместо этого я получаю исключение:

Код исключения StructureMap: 202 Не определен экземпляр по умолчанию для PluginFamily IMyInterface.

Можно ли определить значение по умолчанию для отсутствующего плагина?

Контекст: мой класс, который является сервисом, использует движок представления Spark и определяет некоторые пространства имен по умолчанию.Служба использует ISparkNamespacesProvider (IMyInterface) для добавления дополнительных пространств имен.Клиентское приложение может зарегистрировать такого провайдера или нет.Вот почему конструктор сервиса получит либо провайдера, либо ни одного.

Ответы [ 2 ]

2 голосов
/ 07 октября 2010

Взято из здесь :

For<IService>().Use<MyService>()
 .Ctor<IMyInterface>("nameOfParameter").Is(null);

Но вы должны подумать о том, почему ваш класс зависит от IMyInterface.Если это необязательно - это запах кода.Возможно, вам следует изменить его как аргумент метода для метода, который нуждается в этом, или как устанавливаемое свойство.

Нет необходимости переключаться между конкретной реализацией и нулем.При составлении графа зависимостей в корне композиции вы должны точно знать, какими будут ваши зависимости без .If(isSomething()).Use<MyService>().Ctor<IMyInterface>(null).

Возможно, вы захотите проверить эту презентацию tekpub и этуbook (ищите так называемый доступ к MEAP) о DI и IOC.


Один из способов добиться того, что вы хотите, - это использовать так называемое внедрение зависимости от бедного человека .То есть - для определения второго конструктора:

public MyClass():this(null){...}

Но я бы не советовал.

0 голосов
/ 11 июня 2018

StructureMap теперь поддерживает этот случай через UseIfNone https://structuremap.github.io/registration/fallback-services/

...