通过我的(可能是微薄的)理解,在控制器/演示者的方法中执行此操作被认为是不好的做法,因为它在StructureMap和您的演示者之间创建了依赖关系:
void Override() {
ICommentForOverrideGetter comm = StructureMap.ObjectFactory.GetInstance<ICommentForOverrideGetter>();
因为这种依赖性应该通过构造函数注入到演示者中,并使用IoC容器进行连接。在这种情况下,虽然我的代码每次运行此方法时都需要ICommentForOverrideGetter
的新副本。这是上述最佳实践的例外,还是我应该重新考虑我的架构的情况?
答案 0 :(得分:1)
据说计算机科学没有问题,无法通过更多层次的间接解决:
如果您只是不想在演示者中使用依赖项,请注入工厂界面,真正的实现可以执行新的CommentForOverrideGetter或其他任何操作。
编辑:
“当我认为复杂性/效益比太高时,忽略最佳实践没有问题”:我也不是,但正如我在评论中所说,我不喜欢我想要的代码中对IoC容器的硬依赖性单位测试和主持人就是这种情况。
根据你的ICommentForOverrideGetter所做的,你也可以使用一个简单的CommentForOverrideGetter.CreateNew()但是因为你需要每次调用一个新的实例,我怀疑至少某种与创建有关的逻辑?或者它是一个有状态的“服务”?
答案 1 :(得分:1)
如果您坚持在方法中执行服务定位,则至少应将容器注入控制器,以便可以消除静态方法调用。添加类型为StructureMap.IContainer
的构造函数参数,并将其存储在字段变量中。 StructureMap将注入适当的容器。然后,您可以在该容器上调用GetInstance(),而不是ObjectFactory。