Проблема с TryGetInstance с использованием StructureMap и NET MVC 2 - PullRequest
3 голосов
/ 26 января 2011

Я использую StructurMap (только что обновленный до 2.6.1) и Smart Model Binder Джимми Богарда в моем приложении NET MVC 2. Я также адаптирую технику от Доминика Петтифера , чтобы вы могли использовать связыватель интеллектуальной модели для внедрения DI в ваши viewModels для сценариев обратной передачи, где списки выбора должны быть повторно заполнены!

Я очень мало знаю о StructureMap, и одна из проблем, которые я получал, была structuremap 202 no instance defined error для привязки viewModel с конструкторами без параметров.

Так что в моем IOCMOdelBinder class я пытаюсь использовать TryGetInstance() вместо GetInstance(), так как первый возвращает ноль, если нет совпадения с modelType. В основном, если он не находит зарегистрированный экземпляр, тогда используйте привязку к модели по умолчанию.

Мой переопределение CreateModel класс выглядит так:

protected override object CreateModel(ControllerContext controllerContext,
ModelBindingContext bindingContext, Type modelType)
 {

   var myInstance = ObjectFactory.TryGetInstance(modelType);

   if (myInstance != null)
   {
     return myInstance;
   }
   else
   {
     return base.CreateModel(controllerContext, bindingContext, modelType);
   }
}

Я вынул строку ObjectFactory.GetInstance(modelType); Я ожидал бы, что они будут работать так же, но TryGetInstance вернет ноль, а GetInstance вернет правильный объект ОК, поэтому он определенно находится в реестре. Я могу использовать GetInstance, но нужно обернуть его в try catch, что немного менее элегантно !!! Любые предложения, пожалуйста?

Ответы [ 3 ]

11 голосов
/ 26 января 2011

TryGetInstance означает «если контейнер знает о типе, верните его, в противном случае верните ноль». Это не означает «запросить тип из контейнера, если он по какой-либо причине взорвется, вернуть ноль».

Что вызывает наибольшую путаницу, так это способность StructureMap разрешать конкретные типы без необходимости их предварительной регистрации. Это очень хорошая функция, поскольку вам не нужно регистрировать все ваши конкретные типы, если вы просто хотите, чтобы StructureMap разрешал их зависимости. Однако, поскольку вам не нужно предварительно регистрировать конкретные типы, контейнер не «знает о них», потому что для них нет никакой конфигурации. Поэтому, когда TryGetInstance проверяет, знает ли он о конкретном типе, он решает, что не знает, и возвращает ноль. Однако, если вы просто выполните GetInstance, он даже не проверяет, знает ли он о типе, он распознает его как конкретный и просто строит.

3 голосов
/ 26 января 2011

TryGetInstance будет возвращать только те типы, которые были зарегистрированы, в отличие от GetInstance, который будет создавать незарегистрированные конкретные типы, если это возможно. Смотрите пост Джереми Миллера: http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with-mvc3-please-read-this/

0 голосов
/ 18 мая 2014

В более новой версии TryGetInstance устарел и дозы больше не существует

...