加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:39:31 所属栏目:Java 来源:网络整理
导读:在具有丰富域模型的Web服务器项目中(应用程序逻辑在模型中,而不在服务中)如何处理将依赖项注入模型对象?你有什么经历? 你使用某种形式的AOP吗?喜欢Springs @Configurable注释?加载时间还是构建时间?你遇到的问题? 你用手动注射吗?那你如何处理不同的
在具有丰富域模型的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,……).它只是移动到它所属的地方.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读