我已经阅读了有关 IoC、DIP、DI 和服务定位器的各种文章,但我有点困惑,这是因为有些文章的示例过于模糊,而其他一些文章只有一些具体示例,而没有提及其他案例。
您能否帮我澄清一下,看看下面的例子并简要解释哪些例子与哪种模式匹配?
手动将接口传递给构造函数:
class Consumer { public Consumer(IStore store){...} } ... Consumer c = new Consumer(new ConcreteStore());
与第一个示例相同,但使用了一些 3rd 方库(Unity、Windsor、Ninject)
与第一个示例相同,但使用 BaseStore 类而不是 IStore 接口
将依赖项传递给其他方法,而不是构造函数:
class Consumer { public BySomething(IStore store){...} } ... Consumer c = new Consumer(); c.BySomething(new ConcreteStore());
传递隐藏在其他接口内部的依赖项(此解决方案的奖励 - 当在“世界”中发明了其他一些东西并且消费者希望使用它们时,我们不必更改构造函数参数而只需更新 IWorld;我们可以完全测试时用其他东西替换整个世界):
interface IWorld { IDictionary<string,IStore> Stores { get; set; } IDictionary<string,ICityMap> Maps { get; set; } ... } class Consumer { public Consumer(IWorld world){...} public BySomething(string store, string city){...} } ... IWorld myWorld = new HeavenlyWorld(); ... // adding stores, maps and whatnot Consumer c = new Consumer(myWorld);
一个子问题:在这种情况下,IWorld 是服务定位器还是不完全是?
传递回调函数或委托(在本例中为 .NET Action):
c.BySomething(store, city, new Action(() => {...} ));
我添加了这个案例,因为文章Inversion of Control指出每个回调都是 IoC。这是真的吗?