2017-04-24 37 views
-2

什麼是建模模型(用戶)和數據庫而不運行到循環依賴關係的最佳方式?在Go應用程序中實現SOLID設計

我有一個Go應用程序,我試圖設置。進口結構令人困惑,因爲它似乎並沒有將問題區分開來。我想有一個數據庫商店,需要訪問模型的名稱來遷移它們。讓模型自我遷移似乎很奇怪,這似乎與模型無關。同時,我希望每個模型的驗證都需要導入數據庫存儲。讓商店驗證單個模型似乎更奇怪。然而,這會產生循環依賴。

結構:

models 
    - user.go 
config 
    - store.go 

store.go

... 
// CreateDb - creates table 
func (i *Store) CreateDb() { 
    ... 
    i.DB.AutoMigrate(&models.User{}) 
    ... 
} 
... 

user.go

package models 

type User struct { 
    Email string 
} 

func (u *User) ValidateUser() (err []error) { 
    messages := make([]error, 0) 

    // Uniqueness Validations 
    email := "" 

    email = config.Database.DB.Where("email LIKE ?", u.Email).First(&User) 
    if email != "" { 
     messages = append(messages, errors.New("Email has to be unique")) 

    } 

    return messages 
} 

我試圖將它們放入第三包,但失敗了,因爲它們都需要相同的依賴 - 商店。我也嘗試將它們全部放入我認爲可行的同一個軟件包中,但這似乎破壞了所有結構和問題。

建議?

我的解決辦法

我結束了數據庫指針去耦到一個單獨的包,然後取得的遷移的自舉過程的一部分。然而,我保持驗證符合模型包。

回答

1

我不是一個圍棋傢伙,但既然這是一個設計問題,沒關係。禁止重複電子郵件是業務需求。此外,根據業務需求,可能還有其他需要在驗證之前/之後但在訪問數據庫存儲之前執行的操作。

我會將驗證放在另一個包中,它將充當業務邏輯層並引用模型和存儲包。我將保持模型清潔,就像我們分別在C#中使用POCO,POJO和Java一樣。在Go上下文中不知道叫什麼。 POGO保留給Groovy :)。

請參見下面的僞代碼:

// business 
function AddUser(email) { 
    User user; 
    // validate 
    user = store.GetUserByEmail(email); 
    if (user) { 
     // shout 
    } 
    else { 
     user = new User { Email = email }; // basically initialize user instance to store 
     store.InsertUser(user); 
    } 
} 

這只是基本的我談過。您可以定義業務包用於與商店進行交談的接口,然後是依賴注入,而不是。