2012-09-12 36 views
2

這個問題是針對我正在研究的Java項目,但也可以應用於C#。我應該在哪裏放置我的對象的自定義屬性?在POJO/POCO類或服務層?

無論如何,所以我有一個MVC web項目。其中,我的數據有三個「層」。

com.example.model.dao 
com.example.model.entities 
com.example.model.service 

所以dao是我的低級別數據庫類。像Hibernate包裝等東西 entities是我的POJO和service是我的業務邏輯。

現在我們假設其中一個POJO的是User。在用戶中,它映射到名爲users的數據庫表。此表(和POJO)有兩個字段,firstnamelastname。好的,所以我想把一個方法稱爲getFullName,它簡單地連接了名字和姓氏。

那麼這種方法應該去哪裏?我想過把它放在POJO本身。但是由於有時我們會使用工具從數據庫中生成POJO,因此可能會覆蓋自定義邏輯。無論如何,這是一個商業過程嗎?

我應該把它放在我的服務實現嗎?

感謝您的建議。

回答

1

您應該在業務層中實現自定義業務邏輯。在這種情況下,它應該在您的服務層中,因爲您正在生成POJO。

+0

這真的是我傾向的方向。而不是100%,因爲我們用來生成POJO的工具。這對我來說「感覺很好」。但我仍然對我錯誤的理由持開放態度。大聲笑 – cbmeeks

0

我通常把這種類型的方法放在實體本身中,但是既然你說它可以被覆蓋,你可以爲實體使用一個輔助類。

class UserHelper { 
    String getFullName() { 
    ... 
    } 
    ... more methods 
} 

我沒有看到一個人的全名作爲一個業務流程。

+0

通常情況下,它似乎是一個人的全名聽起來不象一個業務流程。但是,應該在哪裏畫線?成爲業務邏輯需要多複雜?不爭論,只是好奇。我擔心這樣的小「一次性」會開始混亂我的POJO。 – cbmeeks

2

在C#我會用一個局部類(解決「生成的類」問題:當然,你的生成波蘇斯將需要部分)

public partial class User { 
    public string GetFullName() { 
    return string.Format("{0} {1}", FirstName, LastName); 
    } 
} 

解決這不會在Java中工作.. 。因爲部分類不存在!

因此,對於2種語言,「最合適的」解決方案可能不會相同。

+0

是的,我也喜歡這個想法。因爲在這個例子中你正在「重複使用」POCO。但是,這是否違反了「業務層」方法?我不能動搖這個事實,雖然很簡單,但這仍然是一個「商業」的要求。 – cbmeeks

+0

@cbmeeks那麼,在MVC世界中,您可以使用「UserViewModel」類,該類具有FullName屬性(而不是方法)。你必須在完全嚴格,實際嚴格或者根本不嚴格的情況之間進行選擇。你也是唯一知道哪些是最簡單的維護方式,對於協程序員等,你想稱之爲「商業」還是沒有。我不會給這些東西的ISO規則;) –

0

由於許多開發商在這裏,林非常嚴格的設計模式,最佳實踐和標準,但是......

...總有例外的規則,或更確切地說,以準則。

開發人員通常會將這種功能放在邏輯層上,但在某些情況下,可以將其添加到Plain Old(Java/C#/ ...)對象中。

僞代碼:

class DataAccessLayerPerson 
{ 
    public FirstName 
    { 
    get; set; 
    } 

    public MiddleName 
    { 
    get; set; 
    } 

    public LastName 
    { 
    get; set; 
    } 

    public getFullName() 
    { 
    return FirstName + MiddleName + LastName; 
    } 
} 

class BusinessLogicLayerPerson 
{ 
    public FirstName 
    { 
    get; set; 
    } 

    public MiddleName 
    { 
    get; set; 
    } 

    public LastName 
    { 
    get; set; 
    } 

    public FullName 
    { 
    get; set; 
    } 
} 

類似的常見的情況下,是當一個表有一個字段概念性地用作布爾值,但是,編程用作炭(1),其存儲「F」或「T」,或者作爲整數或位,我必須在編程中將它們用作布爾值。

因此,我在數據訪問層中使用了一些邏輯,並將這些字段作爲布爾值進行讀寫。

乾杯。

0

我們在我們的項目中同樣的問題,所以我們做了,因爲這:

@MappedSuperclass 
public class UserDTO { 
    // this is the class which can be regenerated by code generator, and only contains database fields 
} 

@Entity 
public class User extends UserDTO { 
    // this is the class containing more business methods, methods do things that are not part of the database columns 
} 
相關問題