Spring+HibernateEntityManager(Spring+DDDっぽく編 その2)


徹夜明けで満員電車で帰宅 orz

仮眠後出社 o...rz

なんだかなー。

サンプルをちょっとだけ現実的に変更

さすがに、クラス A とかだとリアリティにかけるので、ちょっと変更。

  • User
    • というインタフェースを作成。何のユーザーなのかよく分かりませんが、とりあえずユーザーということで(^^;
  • UserService
    • ユーザーに関するサービスです。何をどうサービスするのかよく分かりませんが、とりあえずユーザーサービスということでw

ドメイン層(API

純粋にドメイン層のAPIを定義しています。インタフェースと javadoc の組み合わせは、結構シンプルです。おいらのお気に入りです。

domain.entity.User インタフェース(domain-api/src/main/java/domain/entity/User.java)
package domain.entity;

import infrastracture.HasGlobalIdentity;

/**
 * ユーザー
 * 
 * @param <I>
 *            ユーザーのグローバル・アイデンティティの型
 * @author beyondseeker
 * @version $Id$
 */
public interface User<I> extends HasGlobalIdentity<I> {
    
    /**
     * ユーザー名を返します。
     * 
     * @return ユーザー名
     */
    String getName();
    
    /**
     * ユーザー名をセットします。
     * 
     * @param name
     *            ユーザー名
     */
    void setName(String name);
    
}
domain.entity.UserService インタフェース(domain-api/src/main/java/domain/service/UserService.java)
package domain.service;

import domain.entity.User;

/**
 * {@link User} 関連の Service です。
 * 
 * @param <I>
 *            ユーザーのグローバル・アイデンティティの型
 * @author beyondseeker
 * @version $Id$
 */
public interface UserService<I> {
    
    /**
     * User を登録します。
     * 
     * @param user
     *            User
     */
    void registerUser(User<I> user);
    
    /**
     * 新規に作成された {@link User} インスタンスを返します。
     * 
     * @return 新規に作成された {@link User} インスタンス
     */
    User<Integer> newUser();
    
}

ドメイン層(実装)

API の実装部です。インタフェースレベルの説明はインタフェースに書かれているので、実装クラスでは特に付加情報がない限りは {@inheritDoc} と書けばOK。ラクチンです。JPA 依存とか、フィールドとか、インタフェースレベルで考えてはいけないドロドロとしたイヤなものをここに書いています。

domain.entity.UserImpl クラス(domain-impl/src/main/java/domain/entity/UserImpl.java)
package domain.entity;

import infrastracture.DomainEntityBaseWithSurrogateIntegerKey;

import javax.persistence.Entity;

/**
 * {@link User} の実装
 * 
 * @author beyondseeker
 * @version $Id$
 */
@Entity(name = "User")
public class UserImpl extends DomainEntityBaseWithSurrogateIntegerKey implements User<Integer> {
    
    /**
     * ユーザー名
     */
    private String name;
    
    /**
     * {@inheritDoc}
     */
    @Override
    public Class<?> getDomainEntityInterface() {
        return User.class;
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public String getName() {
        return name;
    }
    
    /**
     * {@inheritDoc}
     */
    @Override
    public void setName(String name) {
        this.name = name;
    }
    
}
domain.entity.UserServiceImpl クラス(domain-impl/src/main/java/domain/service/UserServiceImpl.java)
abstract public User<Integer> newUser()

については、Lookup Method Injection による、ソースコードからDIコンテナへの依存の解消を参照のこと。

package domain.service;

import infrastracture.ServiceBase;
import domain.entity.User;

/**
 * {@link UserService} の実装。
 * 
 * @author beyondseeker
 * @version $Id$
 */
abstract public class UserServiceImpl extends ServiceBase implements UserService<Integer> {
    
    /**
     * {@inheritDoc}
     */
    @Override
    public void registerUser(User<Integer> user) {
        getEntityManager().persist(user);
    }
    
    /**
     * {@inheritDoc}
     */
    abstract public User<Integer> newUser();
    
}