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:如何使用依赖注入实现上下文?的主要内容,如果未能解决你的问题,请参考以下文章

Spring源码解析-基于注解依赖注入

使用依赖注入时,如何修复“在前一个操作完成之前在此上下文中启动的第二个操作......”?

PHP如何实现依赖注入

Spring各种依赖注入对比

深层理解Spring 控制反转和依赖注入,这一篇文够了

ASP.NET MVC IOC依赖注入之Autofac系列开篇