2011-12-29 105 views
3

吾道的是在安裝,如:如何讓我的服務層中暴露的Dao方法?

UserDao 
UserDaoImpl 

我的業務層是服務類,如:

UserService 
UserServiceImpl 

現在我道的有像獲取,更新,保存等

基本操作我想在我的服務類中公開這些方法,而無需手動將這些方法添加到每個服務接口。

我該如何做到這一點?

回答

2

如果該服務除了CRUD操作沒有其他任何操作,並且沒有其他服務需要該DAO,我不會看到爲什麼您不能將這些操作放在服務實現中,並免除DAO。

這是很容易只使用該服務作爲一個傳遞:

public interface FooService { 
    Foo find(Long id); // Same as DAO signature 
} 

@Service 
public class FooServiceImpl implements FooService { 
    @Resource(name = "fooRepository") 
    private FooRepository fooRepository; 

    public Foo find(Long id) { return this.fooRepository.find(id); } 
} 

有可能寫一個通用的DAO:

public interface GenericRepository<V, K extends Serializable> { 
    V find(K key); 
    List<V> find(); 
    K save(V value); 
    void update(V value); 
    void delete(V value); 
} 
+0

是的,但是當我有10個服務類時,它是編寫代碼的一部分,只是希望有一種方法可以免費使用某些OOP /泛型。 – codecompleting 2011-12-29 16:30:12

+1

@codecompleting:具有與通用存儲庫類似的通用基類,並委派到通用DAO。 – 2011-12-29 17:00:55

+0

我有一個通用的存儲庫,但問題是我使用hibernate時必須通過類類型作爲參數。例如:http://code.google.com/p/hibernate-generic-dao/source/browse/trunk/dao-hibernate/src/main/java/com/googlecode/genericdao/dao/hibernate/GeneralDAOImpl .java我希望我不必這樣做,也許我可以在每個Dao中設置一個私有屬性來設置類的類型,而不必將它作爲參數,您怎麼看? – codecompleting 2011-12-29 22:40:53

0

是的,這是一種適配器模式

的變化

您還可以將UserDaoImpl擴展爲UserServiceImpl,例如

UserServiceImpl extend UserDaoImpl implements UserService{ 
    // Rest of the Service implementation 
    } 
+0

這裏具體繼承嗎?醜陋。爲什麼不簡單地使用委派? – Saish 2011-12-30 14:26:40

+0

是的,我們可以在這裏有策略模式 – Jyotirup 2011-12-30 16:41:17

+1

策略是正式實現的,而不是繼承。 http://en.wikipedia.org/wiki/Strategy_pattern – Saish 2011-12-30 18:30:12

3

服務的要點是在事務中聚合DAO方法,並添加業務邏輯。如果你所有的服務都在包裝單獨的DAO方法,那麼沒有必要擁有它們。使用像Grails這樣的框架(或者Play,所以你仍然可以使用Java)數據訪問方法被動態地添加到你的域對象中,你可以從控制器中調用它們,並且有更少的CRUD代碼來混亂如果您以後需要這些服務,請選擇服務作爲選項)。

+0

同意的意見,但我會有業務邏輯可能不是基本的獲取/更新/刪除方法,並且必要時我會覆蓋。 – codecompleting 2011-12-29 19:02:02