StructureMap внедрил IContainer - откуда он? - PullRequest
1 голос
/ 24 августа 2010

У меня есть приложение ASP.Net MVC, и я использую StructureMap в MVC, чтобы склеить все приложение вместе.Некоторые классы моделей имеют тяжелые зависимости, которые не используются во всех общедоступных методах, поэтому я передаю IContainer конструктору модели и использую его для создания тяжелых зависимостей по требованию.

Мой вопрос: гдеIContainer исходить из того, что вводится?Это ссылка на тот, который централизованно принадлежит MVC (это логический родитель), или это совершенно новый, созданный и настроенный исключительно для этого класса?

1 Ответ

2 голосов
/ 25 августа 2010

Контейнер, внедренный в конструктор с параметром IContainer, является тем же контейнером, который создает экземпляр класса с помощью конструктора.

Джереми Миллер выразил такое поведение как «IContainer внедряется в себя по умолчанию» в своем блоге на NHibernate с StructureMap .

Не могли бы вы использовать фабричную модель для создания этих зависимостей, когда это необходимо, чтобы уменьшить вашу связь с контейнером?

Вы можете сделать так, чтобы ваша модель принимала Func в качестве параметра и могла использовать SM для автоматического ввода:

public class MyModel
{
   Func<IHeavyDep> _heavyFactory;
   public MyModel(Func<IHeavyDep> dependency)
   {
      _heavyFactory = dependency;
   }

   public void UsesHeavy()
   { 
      var heavy = _heavyFactory();
      heavy.DoMyStuff();
   }
}
...