IoC(StructureMap)最佳实践

时间:2010-09-20 15:08:56

标签: inversion-of-control structuremap ioc-container

通过我的(可能是微薄的)理解,在控制器/演示者的方法中执行此操作被认为是不好的做法,因为它在StructureMap和您的演示者之间创建了依赖关系:

void Override() {
    ICommentForOverrideGetter comm = StructureMap.ObjectFactory.GetInstance<ICommentForOverrideGetter>();

因为这种依赖性应该通过构造函数注入到演示者中,并使用IoC容器进行连接。在这种情况下,虽然我的代码每次运行此方法时都需要ICommentForOverrideGetter的新副本。这是上述最佳实践的例外,还是我应该重新考虑我的架构的情况?

2 个答案:

答案 0 :(得分:1)

据说计算机科学没有问题,无法通过更多层次的间接解决:

如果您只是不想在演示者中使用依赖项,请注入工厂界面,真正的实现可以执行新的CommentForOverrideGetter或其他任何操作。

编辑:

“当我认为复杂性/效益比太高时,忽略最佳实践没有问题”:我也不是,但正如我在评论中所说,我不喜欢我想要的代码中对IoC容器的硬依赖性单位测试和主持人就是这种情况。

根据你的ICommentForOverrideGetter所做的,你也可以使用一个简单的CommentForOverrideGetter.CreateNew()但是因为你需要每次调用一个新的实例,我怀疑至少某种与创建有关的逻辑?或者它是一个有状态的“服务”?

答案 1 :(得分:1)

如果您坚持在方法中执行服务定位,则至少应将容器注入控制器,以便可以消除静态方法调用。添加类型为StructureMap.IContainer的构造函数参数,并将其存储在字段变量中。 StructureMap将注入适当的容器。然后,您可以在该容器上调用GetInstance(),而不是ObjectFactory。