使用StructureMap和NET MVC 2的TryGetInstance问题

Eus*_*ton 3 .net structuremap asp.net-mvc inversion-of-control

我在NET MVC 2应用程序中使用StructurMap(刚刚升级到2.6.1)和Jimmy Bogard的智能模型绑定器.我也正在调整Dominic Pettifer的技术,以便您可以使用智能模型绑定器将DI注入到viewModel中,以获得需要重新填充选择列表的回发方案!

我知之甚少StructureMap,我得到的一个问题是structuremap 202 no instance defined errorviewModel与无参数构造函数的绑定.

所以在我的IOCMOdelBinder class尝试使用TryGetInstance()而不是GetInstance()前者如果与modelType不匹配则返回null.基本上,如果它找不到已注册的实例,则回退到默认的模型绑定器.

我的覆盖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);
   }
}
Run Code Online (Sandbox Code Playgroud)

我拿出了ObjectFactory.GetInstance(modelType);我希望它们以相同的方式工作的行,但TryGetInstance返回null并GetInstance返回正确的对象,所以它肯定在注册表中.我可以使用GetInstance但必须将它包装在try catch中,这有点不那么优雅!有什么建议吗?

Jos*_*gan 11

TryGetInstance表示"如果容器知道类型,则返回它,否则返回null".它并不意味着"从容器中请求类型,如果因任何原因而爆炸,则返回null".

导致最混乱的是StructureMap能够解析具体类型而无需先注册它们.这是一个非常好的功能,因为如果您只想让StructureMap解析它们的依赖关系,则不必注册所有具体类型.但是,由于您不必预先注册具体类型,因此容器不会"了解它们",因为它们没有任何配置.因此,当TryGetInstance检查它是否知道具体类型时,它决定它不会,并返回null.但是,如果您只是简单地执行GetInstance,它甚至不会检查它是否知道类型,它将其识别为具体并且只是构建它.