微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 如何处理将依赖项注入富域模型?

在具有丰富域模型的Web服务器项目中(应用程序逻辑在模型中,而不在服务中)如何处理将依赖项注入模型对象?你有什么经历?

你使用某种形式的AOP吗?喜欢Springs @Configurable注释?加载时间还是构建时间?你遇到的问题?

你用手动注射吗?那你如何处理不同的实例化场景(通过库创建对象[如Hibernate],用“new”创建对象……)?

或者您是否使用其他方式注入依赖项?

解决方法

我们使用Spring的@Configurable(以及常规的new运算符),它就像魅力一样.没有更多 anemic domain models.最后,这是更加面向对象的设计,不是吗:
Person person = new Person(firstname,lastname);
// weird
peopleService.save(person);
// good (save is @Transactional)
person.save();

Mail mail = new Mail(to,subject,body);
// weird
mailService.send(mail);
// good (send is @Transactional)
mail.send();

我们还没有做过任何性能比较.到目前为止,我们根本没有觉得有必要这样做.

编辑:这是人类的样子:

@Configurable("person")
public class Person {
    private IPersonDAO _personDAO;
    private String _firstname;
    private String _lastname;

    // SNIP: some constructors,getters and setters

    @Transactional(rollbackFor = DataAccessException.class)
    public void save() {
        _personDAO.save(this);
    }

    @Transactional(readOnly = true)
    public List<Role> searchRoles(Company company) void{
        return _personDAO.searchRoles(this,company);
    }

    // it's getting more interesting for more complex methods
    @Transactional(rollbackFor = DataAccessException.class)
    public void resignAllRoles(Company company) {
        for (Role role : searchRoles(company)) {
            role.resign();
        }
    }
}

// the implementation Now looks like this
personService.getPerson(id).resignAllRoles(company);

// instead of this
roleService.resignAll(personService.searchRoles(personService.getPerson(id),company));

这就是Spring配置:

<context:spring-configured />
<bean id="person" class="org.example.model.Person" lazy-init="true">
  <property name="personDAO" ref="personDAO" />
</bean>

注意:如您所见,周围仍有服务,例如:搜索对象(personService.getPerson(id))但是对传递的对象(例如人)进行操作的所有方法都将移动到该类本身(即person.save()而不是personService.save(person)).该方法本身保持不变,适用于任何底层数据访问层(纯JDBC,Hibernate,JPA,……).它只是移动到它所属的地方.

原文地址:https://www.jb51.cc/java/129381.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐