东西一直在窃听我,因为我在另一个stackoverflow问题(精确的一个现在回避了我)读到一个答案,其中用户说类似“如果你'我打电话给服务定位器,你做错了“依赖注入与Ninject,MVC 3和使用服务定位器模式
这是一个有很高声誉的人(我觉得在成千上万的人中),所以我倾向于认为这个人可能知道他们在说什么。自从我第一次开始学习它以来,我一直在使用DI作为我的项目,它与单元测试有什么关系,什么不是。这是我现在很舒服,我认为我知道我在做什么。
但是,有很多地方我一直在使用服务定位器来解决项目中的依赖关系。一旦主要的例子来自我的ModelBinder实现。
典型模型活页夹的示例。
public class FileModelBinder : IModelBinder {
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext) {
ValueProviderResult value = bindingContext.ValueProvider.GetValue("id");
IDataContext db = Services.Current.GetService<IDataContext>();
return db.Files.SingleOrDefault(i => i.Id == id.AttemptedValue);
}
}
不是一个真正的实现 - 只是一个简单的例子
由于ModelBinder的实施需要一个新的实例时,将粘合剂第一要求,这是不可能的使用依赖注入的构造函数此具体实施。
这是很多我的课程。另一个例子是Cache Expiration过程,只要缓存对象在我的网站中到期,它就会运行一个方法。我运行一堆数据库调用,而不是。我也使用服务定位器来获得所需的依赖关系。
另一个问题最近我(我张贴的问题就在这里约)是我所有的控制器需要我用DI为IDataContext的实例 - 但一个操作方法需要IDataContext的不同实例。幸运的是,Ninject以一种有名的依赖来救援。但是,这感觉就像一个混乱,而不是一个真正的解决方案。
我认为我至少理解了关注分离的概念,但是在理解依赖注入和服务定位器模式方面似乎存在根本错误 - 我不知道那是什么。
我目前了解它的方式 - 这也可能是错误的 - 至少在MVC中,ControllerFactory会为控制器查找构造函数,并调用服务定位器本身以获取所需的依赖关系,然后通过他们进来。但是,我可以理解,并非所有的班级和没有工厂来创建它们。所以在我看来,一些服务定位模式是可以接受的...但是...
- 什么时候不可接受?
- 当我应该重新思考我如何使用服务定位器模式时,应该注意什么样的模式?
- 我的ModelBinder实现是否错误?如果是这样,我需要学习如何解决它?
- 在另一个问题中,沿着这一行的用户Mark Seemann推荐了一个抽象工厂 - 这与此有何联系?
我想就是这样 - 我无法真正想到任何其他问题来帮助我理解,但任何额外的信息是非常感谢。
我知道DI可能不是所有事情的答案,我可能会在实现它的过程中过度放弃,但是,它似乎以我期望的方式与单元测试一起工作,而不是如此。
我不是在寻找代码来修复我的示例实现 - 我期待学习,寻找解决方案来解决我有缺陷的理解。
祝希望stackoverflow.com有能力保存草稿问题。我也希望无论谁回答这个问题都能得到适当的回答这个问题的声誉,因为我想我要求很多。提前致谢。
我想你是指马克西曼和这篇博文:http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx – 2011-01-11 12:42:05