我发现自己在围绕基于字符串的“服务定位器”概念的模糊问题上苦苦挣扎。
对于初学者来说,IoC 很棒,而对接口进行编程是要走的路。但是,除了无需编译的可重构性之外,我看不出这里使用的黄页模式的最大好处在哪里。
应用程序代码将使用(Spring)容器从中检索对象。现在这很好:因为代码只需要知道所需的接口(要转换为)、Spring 容器接口和所需对象的名称,因此消除了很多耦合。
public void foo(){
((MyInterface) locator.get("the/object/I/need")).callMe();
}
当然,定位器可以填充大量各种Object
衍生对象的对象。
但我有点困惑的是,按名称检索对象的“灵活性”实际上以类型不安全、查找不安全的方式隐藏了依赖关系:我的编译器用来检查请求的对象成员是否存在,它是类型,现在所有这些都被推迟到运行时阶段。
我能想到的最简单、功能上还不错的模式是一个巨大的、应用范围内struct
的对象:
public class YellowPages {
public MyInterface the_object_i_need;
public YourInterface the_object_you_need;
....
}
// context population (no xml... is that bad?)
YellowPages locator = new YellowPages();
locator.the_object_i_need=new MyImpl("xyx",true),
locator.the_object_you_need=new YourImpl(1,2,3)
public void foo(){
locator.the_object_i_need.callMe(); // type-safe, lookup-safe
}
是否有办法/模式/框架要求编译器解析请求的对象,并检查它的类型是否正确?是否有 DI 框架也可以做到这一点?
非常感谢