0

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);
    }
}

最后一个似乎更好一些,但我从未见过它像这样实现,所以我很好奇是否有任何事情需要考虑。

4

1 回答 1

2

Command和DCI之间存在对比。在 Command 中,您分配对象之间的交互,在 DCI 中,您通过角色方法集中交互。在 MoneyTRansfer 示例中,账户将无法提取或存款,因为它们是没有行为的简单数据。但是,在诸如 Transfer 之类的上下文中,角色将存在该行为。因此,当源账户角色绑定到账户对象时,账户对象将获得提款行为,目标账户也是如此。

在命令模式中,它们具有行为,但行为的执行是在命令对象中编写的并且可以传递。整个交互不是命令对象的一部分,而是通常分布在参与对象之间。

在 Marvin 中,一种支持 DCI 的语言构建是因为大多数现代语言仅部分支持 DCI,因此您只能将角色绑定到构造函数中的对象。如何调用构造函数与上下文无关。这可确保为所有角色完成一次绑定。只有通过实例化另一个上下文才能重新绑定。这不是 DCI 的限制,而是 Marvin 的设计选择。

关于上下文方法是否可以接受参数的问题,这有点哲学,但据我记得上次我与 Trygve Reenskaug 辩论时,我们同意他们可以接受参数,我知道我已经实现了一些他们在哪里做的例子(包括在DCI 网站上的汇款)。

于 2012-10-29T11:21:34.290 回答