代码之家  ›  专栏  ›  技术社区  ›  Arne Deutsch

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

  •  7
  • Arne Deutsch  · 技术社区  · 14 年前

    你使用某种形式的AOP吗?像弹簧一样?加载时间还是构建时间?你遇到的问题?

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

    3 回复  |  直到 14 年前
        1
  •  4
  •   sfussenegger    14 年前

    我们使用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();
    

    不过,我们还没有做任何性能比较。到目前为止,我们根本没有必要这么做。

    编辑:person类就是这样的:

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

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

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

        2
  •  3
  •   PålOliver    14 年前

    为此,我们使用了普通的Spring构造函数注入来简化测试。

    如果您需要向实体中注入一些东西,一个建议是编写一个构建器或工厂,然后在那里注入您需要的东西。

        3
  •  0
  •   user3201420    10 年前

    对软件体系结构和富域模型的实用观点描述了富域模型和软件体系结构的交汇点。

    此外,它还描述了如何使用以下技术、框架和api配置、实现和junit此视图:

    1. 摩根大通;对象关系映射
    2. AspectJ;以充分体验丰富的域模型
    3. 朱尼特;用于富域模型的集成测试

    http://www.ruimtefotografie.org/forum/viewtopic.php?f=32&t=193