2

私はSpringMVCプロジェクトを初めて構築していて、自分の設計に関するフィードバックが必要でした。

現在、私は次のUserDaoを持っています

package org.myproj.com.dao;

import org.myproj.com.entity.User;

public interface UserDao {
    public User getById(Long id);
}

これはUserDaoImplによって実装されます

package org.myproj.com.dao;

import org.myproj.com.entity.User;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository("userDao")
public class UserDaoImpl implements UserDao{


    @Autowired
    private SessionFactory sessionFactory;

    public User getById(Long id) {
        return (User) sessionFactory.getCurrentSession().get(User.class, id);
    }

}

次に、サービスレイヤーUserServiceがあります

package org.myproj.com.service;

import org.myproj.com.entity.User;

public interface UserService {
    public User getById(Long id);
}

implを使用すると、UserServiceImpl

package org.myproj.com.service;

import org.myproj.com.dao.UserDao;
import org.myproj.com.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service("userService")
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;


    public UserServiceImpl() {
    }

    @Transactional
    public User getById(Long id) {
        return userDao.getById(id);
    }

}

次に、これは私のサーブレットによってアクセスされます...

@Autowired
    private UserService userService;

User user = userService.getById(1L);

私のダオと私のサービスがたくさん複製していると感じずにはいられません。サービスレイヤーを使用してロールなどを追加することを検討しており、Daoがビジネスロジックを実行します。

このデザインについてどう思いますか?それは受け入れられますか?

4

2 に答える 2

3

私見では、ビジネストランザクションのセマンティクスをサービスレイヤーに配置し、データ側のビルディングブロックをdaoレイヤーに配置するのが最善です。daoレイヤーは、サービスによって使用されるデータAPIです。したがって、daoレイヤーUserDaoにはfindByName(String username)メソッドがあるかもしれませんが、サービスレイヤーにはありません。代わりに、サービス層にはとがあり、SecurityServiceそれauthenticateUser(String username)はとりわけ、を呼び出しますuserDao.findByName(username)。そして、もしあなたがUserDetailService、、addEmailAddressToUser(String username)まあ、それは同じdaoメソッドを呼び出すでしょう。

于 2012-07-06T12:45:33.587 に答える
1

簡単な例を示すと少し繰り返しに見えるのは確かですが、サービスレイヤーがより複雑になり始め(複数のサービス/ DAOを調整する)、DAOのクエリがより複雑になると、ビジネスロジックとデータが分離されますアクセスロジックがより理にかなっているようになります...

サービスとDAOのインターフェースは必ずしも同じように見えるとは限りません。1つはより粗く、トランザクションベースである必要があり、もう1つはエンティティとデータベースクエリに基づいている必要があります。

于 2012-07-06T12:49:42.130 に答える