Указание StructureMap использовать другой конструктор - PullRequest
9 голосов
/ 09 августа 2011

У меня есть класс с 2 конструкторами.

MyClass ()

и

MyClass (сервис IMyService)

Как мне сообщить StructureMap, тогда всякий раз, когда я делаю 'new MyClass ()', он должен фактически вызывать второй конструктор, а не первый конструктор.

Пожалуйста, помогите.

Ответы [ 3 ]

22 голосов
/ 09 августа 2011

Если вы звоните new MyClass(), то StructureMap вообще не участвует. Никакая конфигурация StructureMap не изменит поведение.

Если вы вызовете ObjectFactory.GetInstance<MyClass>(), StructureMap по умолчанию вызовет конструктор с большим количеством параметров.

Если вы хотите, чтобы StructureMap использовал другой конструктор, вы можете указать конструктор (через ответ PHeiberg):

x.SelectConstructor<IMyClass>(() => new MyClass(null));

Или вы можете просто явно указать StructureMap, как создать экземпляр, используя перегрузку Use(), которая принимает Func<>:

x.For<IMyClass>().Use(ctx => new MyClass(ctx.GetInstance<IMyService>()))
5 голосов
/ 10 августа 2011

Ответ Иисуса Навина охватывает все аспекты. В качестве примечания, чтобы настроить Structuremap для выбора конкретного конструктора без жесткого кодирования аргументов конструктора, как это сделано в примере с Джошуа, вы можете использовать метод SelectContructor:

x.SelectConstructor<MyService>(() => new MyService());

Лямбда в вызове метода SelectConstructor должна вызывать необходимый конструктор (поставить нулевые значения или любое значение правильного типа для всех присутствующих параметров). См. документацию для получения дополнительной информации.

0 голосов
/ 11 августа 2011

При использовании DI-контейнера, такого как Structuremap, лучше всего иметь только один конструктор для каждого класса.Этот конструктор должен разрешать все зависимости класса, если IMyService является зависимостью (хотя это выглядит немного странно), это всегда следует разрешать при создании экземпляра, чтобы не нуждаться в конструкторе без параметров.

...