首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DCI:如何通过依赖注入实现上下文?

DCI:如何通过依赖注入实现上下文?
EN

Stack Overflow用户
提问于 2012-10-29 12:34:00
回答 1查看 1.6K关注 0票数 0

DCI上下文的大多数示例都是作为命令模式实现的。但是,在使用依赖注入时,将依赖注入到构造函数中并将参数发送到执行方法中是很有用的。比较Command pattern类:

代码语言:javascript
复制
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);
    }
}

使用依赖注入类:

代码语言:javascript
复制
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);
    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-29 19:21:34

在Command和DCI之间有一个对比。在Command中,您可以分布对象之间的交互;在DCI中,您可以通过角色方法集中交互。在MoneyTRansfer示例中,帐户将不能存取,因为它们是没有任何行为的简单数据。但是,在诸如传输之类上下文中,将存在角色的行为。因此,当源帐户角色绑定到帐户对象时,帐户对象将获得提取行为,目标帐户也是如此。

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

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

对于上下文方法是否可以接受参数的问题,这有点哲学上的问题,但就我记得上次我与Trygve Reenskaug辩论时,我们同意他们可以接受参数,我知道我已经实现了几个例子(包括DCI site上的moneytransfer )。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13115890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档