2010-10-22 94 views
3

我有一個困境,我不知道最好的方式來開始解決它。爪哇/春天:觀看豆

我正在使用舊的代碼庫工作。一些域對象(和它們後面的數據庫表)沒有太大意義。例如,deleted被存儲爲longage被存儲爲String等等,我已經能夠很好地工作。在我看來,可以說if (deleted == 1)...。但是有一些具體的業務邏輯通過將其納入視圖而導致維護問題。這裏有一個例子:

String title = null; 
if (obj.getTitle != null) { 
    title = obj.getTitle(); 
} else { 
    title = obj.getName() + " - " + obj.getCategory(); 
} 

我真的很想有一個「視圖bean」裏這個業務邏輯和合法的奇特得到妥善解決,並存儲,這樣我可以在多個視圖中使用它,但然後改變它在一個地方。如果我有一個Product POJO,然後我ProductViewBean,作爲一個例子,我會做這樣的事情:

productViewBean.setDeleted(product.getDeleted() == 1); 
productViewBean.setTitle(product.getTitle() != null ? product.getTitle() : product.getName() + " - " + product.getCategory()); 

我的問題是,我應該在哪裏做呢?我是否應該注入manager(注入適當daos)注入我的controller並返回我的「視圖bean」?或者我對這一切都錯了,可以有更好的方法嗎?

在此先感謝

(注:據我瞭解,底層結構是真正的問題,但它超出了我的管轄範圍在這一點上改變太多的項目中使用這些域對象,甚至如果我沒有乾淨。建立db/domain對象(所以deletedboolean等)我仍然留下不可避免的業務邏輯(如果!標題,然後'構建其他組件的標題'),我不會在數據層中就像封裝在一個地方,以便控制器或視圖都不必擔心它,並且可以在多個控制器/視圖中使用它。我恰好處於可以編寫高效且可維護,並且甚至可以創建一個很好的層來緩解cl在未來的這些領域對象的eanup。)

回答

0

我會嘗試一個適配器委託給域對象,如下所示。控制器和視圖使用這一個。如果ProductViewBean與管理器位於同一個包中,則管理者只能使用getDelegate()方法將其傳遞給dao。

public class ProductViewBean { 
    private final Product delegate; 

    public ProductViewBean(Product delegate) { 
    this.delegate = delegate; 
    } 

    Product getDelegate() { 
    return delegate; 
    } 

    public String getTitle() { 
    if (delegate.getTitle == null) { 
     return delegate.getName() + " - " + delegate.getCategory(); 
    } 
    return delegate.getTitle(); 
    } 

    public void setTitle(String title) { 
    delegate.setTitle(title); 
    } 

    public boolean isDeleted() { 
    return delegate.getDeleted() == 1L; 
    } 

    public void setDeleted(boolean deleted) { 
    delegate.setDeleted(deleted ? 1L : 0L); 
    } 

    ... 
} 

所以你可以製作你喜歡的API。

1

我敢打賭,你可以排序所有在Spring數據綁定和驗證API。

我也想說你應該有一個服務層不同於web控制器層。將服務注入到Web層並讓他們完成所有工作。他們擔心工作單位,交易和DAO對象。