Может ли внедрение зависимостей задерживать создание необходимых объектов?

Я играю с внедрением зависимостей (StructureMap) с моим приложением ASP.NET MVC. Работает отлично.

Becuase StructureMap использует DI через самый жёсткий конструктор (я надеюсь, что я правильно назвал эту концепцию), у меня сложилось впечатление, что он создает экземпляр объекта для каждого аргумента, в наиболее гибком конструктор.

Итак, можно ли указать структуре DI (в данном случае это StructureMap, но мне любопытно, может ли она сделать это для любой другой платформы .NET DI Framework) НЕ создавать экземпляр при вызове конструктора, а задерживать это строительство объекта пока не требуется?

Сорта вроде конструкции ленивых объектов или чего-то в этом роде ...


person Pure.Krome    schedule 18.10.2009    source источник
comment
Я был бы удивлен, если ты не сможешь. Я нашел, как отключить поведение инъекции по умолчанию, что может быть полезно, если вы не можете найти метод "по дизайну": structuremap.sourceforge.net/FAQ.htm#FAQ11   -  person Matt Kocaj    schedule 18.10.2009


Ответы (2)


Все платформы di, которые поддерживают сопоставления с областью действия singleton-> сеанс / запрос, обычно создают экземпляр прокси-объекта вместо «реального» объекта, когда объекту singleton требуется доступ к объекту с областью действия сеанса. Создание «реального» экземпляра обычно откладывается до первого вызова метода на прокси-сервере.

Я считаю, что Castle Windsor поддерживает этот механизм.

person krosenvold    schedule 18.10.2009

Краткий ответ: да, вы можете это сделать. Зарегистрируйте свои типы с помощью класса .Net 4 Lazy<T> следующим образом:

x.For(typeof(Lazy<>)).Use(typeof(Lazy<>))
 .CtorDependency<bool>("isThreadSafe").Is(true);

Подробный ответ и объяснение см. В моем ответе на вопрос 6811956. Я думаю, это даст вам то, что вам нужно. Если вы не используете .Net 4, вам придется реализовать свой собственный класс Lazy<T>, чтобы это осуществить. См. Вопрос 3207580 в качестве отправной точки.

Поддерживает ли Structuremap Lazy из коробки?

Реализация Lazy ‹T› для .NET 3.5

ОБНОВЛЕНИЕ: в StructureMap 3 «CtorDependency» стал просто «Ctor», но в остальном, похоже, работает точно так же.

person Mel    schedule 01.08.2011
comment
Этот вопрос не касался конкретного типа Lazy, поэтому я думаю, что этот ответ, хотя и полезен, представляет собой своего рода обходной путь. Самый простой ответ - просто принять Func ‹T› вместо аргументов конструктора. - person Joshua Flanagan; 03.09.2011
comment
Он спрашивал, можно ли отложить создание объектов, и я показал, как это сделать с помощью класса Lazy ‹T›, поскольку именно для этого он предназначен. Принятие Func ‹T› - это еще один способ сделать то же самое, только теперь ВЫ несете ответственность за кэширование результатов первого выполнения, чтобы не создавать новую копию каждый раз, когда вы ссылаетесь на Func. Я считаю, что класс Lazy ‹T› - это чистый способ избежать этих проблем, и поэтому я бы порекомендовал именно этот подход для решения исходной проблемы. - person Mel; 06.09.2011