发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA
1 2 3 下一页 Go 3

对依赖注入的一点想法

    
2009-06-18 16:05
赞助商链接

对于spring中的IOC,大家都知道这个仅仅是对属性的依赖注入,也就是这种方式解决了类与类之间的依赖问题。现在大家的讨论好像都集中在域模型的是否充血的问题上,就是说是否给模型加上行为(业务方法)。这样我就想有没有一种方式可以实现方法的依赖注入的问题,这样是否就可以更大的解耦了呢?
初步想法是这样的:
public class A{
String name;
IBehavior behavior;
public doA(){
behavior.doA(this.name);//委托给行为类
}
public doB(){
behavior.doB(this.name);
}

}

public interface IBehavior{
public doA(String aparam);
public doB(String aparam);
}

public abstract class AbstractBehavior implements IBehavior{
// 默认实现
}

自己通过extends AbstractBehavior 类或者implements IBehavior 也可以实现自己特定的要求再通过spring的IOC把依赖关系注入,通过改变这个注入的类可以改变类A的行为

调用就需要:context.getBean("a").doA();

不过现在觉得现在这样的实现有种画蛇添足的感觉!

不知道大家对方法的注入有什么想法?不知道能否直接实现方法的注入而不是通过这这样的间接的方式!


PS:我看Jdonframework对于struts 中的几个saveAction,updateAction等的处理好像就是通过配置来实现方法的委托的,好像这个也可以说是方法的注入吧。


[该贴被pliaozrlp于2009-06-18 16:39修改过]

2009-06-19 09:49

很好的想法。

>通过改变这个注入的类可以改变类A的行为

其实行为如果需要变化拓展,那么可以将行为抽象为单独的行为类,然后使用属性依赖注射。

行为和属性都可以动态转为另外一个对象,这就是对象设计的魅力和灵活性。

2009-06-19 10:46

谢谢banq的回复!
这个只是个最初的想法。其实我心中最完美的解决方案是(以spring为例):
<bean id="a" class="A">
<property name="name"><value>XXX<value></property>
<method name="doA"><value>行为类的全限定名</value></method>//通过这样的声明就完成了方法的注入
</bean>
这样的话就把行为类的同名方法所完成的行为注入到类A中的,而在类A中我要做就是就是一个方法的声明

这样做的话就可以说实现了方法像属性一样的注入了

好像通过spring的look-up和replaced-method可以实现这样的功能!


[该贴被pliaozrlp于2009-06-19 11:13修改过]

2009-06-19 11:27

》》behavior.doB(this.name);

这样不可取 我觉得应该是 behavior.doB(this.classname);不同的class决定不同的行为。不过觉得可以使用继承的方式来实现。

2009-06-19 11:34

>behavior.doB(this.classname);不同的class决定不同的行为
这样的话怎么把类A的属性作为参数传递给行为方法呢?

3Go 1 2 3 下一页

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com