DCI上下文的大多数示例都是作为命令模式实现的。但是,在使用依赖注入时,将依赖注入到构造函数中并将参数发送到执行方法中是很有用的。比较Command pattern类:
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);
}
}最后一个似乎更好一些,但我从来没有见过它像这样实现,所以我很好奇是否有什么需要考虑的事情。
发布于 2012-10-29 19:21:34
在Command和DCI之间有一个对比。在Command中,您可以分布对象之间的交互;在DCI中,您可以通过角色方法集中交互。在MoneyTRansfer示例中,帐户将不能存取,因为它们是没有任何行为的简单数据。但是,在诸如传输之类上下文中,将存在角色的行为。因此,当源帐户角色绑定到帐户对象时,帐户对象将获得提取行为,目标帐户也是如此。
在命令模式中,它们具有行为,但行为的执行是在命令对象中编写脚本的,并且可以传递。整个交互不是命令对象的一部分,而是通常分布在参与对象之间。
在Marvin中,支持DCI的语言构建是因为认识到大多数现代语言只部分支持DCI,您只能将角色绑定到构造函数中的对象。如何调用构造函数与上下文无关。这确保了为所有角色绑定一次。然后,只有通过实例化另一个上下文才能重新绑定。这不是DCI的限制,而是Marvin的设计选择。
对于上下文方法是否可以接受参数的问题,这有点哲学上的问题,但就我记得上次我与Trygve Reenskaug辩论时,我们同意他们可以接受参数,我知道我已经实现了几个例子(包括DCI site上的moneytransfer )。
https://stackoverflow.com/questions/13115890
复制相似问题