DCI:如何使用依赖注入实现上下文?
Posted
技术标签:
【中文标题】DCI:如何使用依赖注入实现上下文?【英文标题】:DCI: How to implement Context with Dependency Injection? 【发布时间】:2012-10-18 10:17:27 【问题描述】:DCI 上下文的大多数示例都是作为命令模式实现的。但是,当使用依赖注入时,将依赖注入到构造函数中并将参数发送到执行方法中很有用。比较命令模式类:
public class SomeContext
private readonly SomeRole _someRole;
private readonly IRepository<User> _userRepository;
// Everything goes into the constructor for a true encapsuled command.
public SomeContext(SomeRole someRole, IRepository<User> userRepository)
_someRole = someRole;
_userRepository = userRepository;
public void Execute()
_someRole.DoStuff(_userRepository);
使用依赖注入类:
public class SomeContext
private readonly IRepository<User> _userRepository;
// Only what can be injected using the DI provider.
public SomeContext(IRepository<User> userRepository)
_userRepository = userRepository;
// Parameters from the executing method
public void Execute(SomeRole someRole)
someRole.DoStuff(_userRepository);
最后一个似乎更好一些,但我从来没有见过它是这样实现的,所以我很好奇是否有任何事情需要考虑。
【问题讨论】:
命令和 DCI 之间只有很少的共同点。 DCI 不是一种模式,而是一种范式,您可以在其中找到 OO 和 FP 当然,我只是在实现上看到了一些相似之处,没有其他建议。 :) 您描述的代码看起来很像here 描述的用例驱动设计。只需将名称“Command”替换为“SomeRole”,将“CommandHandler”替换为“SomeContext”即可。 确实有,但是有点遗憾我把DCI和一个pattern放在一起提到了,会导致混乱。另外,我评论 Execute 方法中参数问题的答案已被删除。 【参考方案1】:Command 和 DCI 之间存在对比。在 Command 中,您分配对象之间的交互,在 DCI 中,您通过角色方法集中交互。在 MoneyTRansfer 示例中,账户将无法提取或存款,因为它们是没有行为的简单数据。但是,在诸如 Transfer 之类的上下文中,角色将存在该行为。因此,当源账户角色绑定到账户对象时,账户对象会获得提款行为,目标账户也是如此。
在命令模式中,它们具有行为,但行为的执行是在命令对象中编写的并且可以传递。整个交互不是命令对象的一部分,而是通常分布在参与对象之间。
在 Marvin 中,一种支持 DCI 的语言构建,因为大多数现代语言仅部分支持 DCI,您只能将角色绑定到构造函数中的对象。如何调用构造函数与上下文无关。这可确保为所有角色完成一次绑定。只有通过实例化另一个上下文才能重新绑定。这不是 DCI 的限制,而是 Marvin 的设计选择。
关于上下文方法是否可以接受参数的问题,这有点哲学,但据我记得上次我与 Trygve Reenskaug 辩论时,我们同意他们可以接受参数,我知道我已经实施了一些示例(包括DCI site 的汇款)。
【讨论】:
以上是关于DCI:如何使用依赖注入实现上下文?的主要内容,如果未能解决你的问题,请参考以下文章