我有一些擴展常見類型的類型,這些是我的模型。由於循環引用而決定如何訂購F#類型的問題
然後,我爲每個CRUD操作的模型類型都有DAO類型。
我現在需要一個函數來讓我找到一個給定任何模型類型的id,所以我爲一些輔助函數創建了一個新類型。
問題是我不知道如何訂購這些類型。目前我的模特在dao之前,但我不知何故需要DAOMisc
之前CityDAO
和CityDAO
之前DAOMisc
,這是不可能的。
簡單的辦法是把每個DAO此功能,指的只是前,可以來的類型,所以,State
到來之前City
爲State
與City
一個外鍵關係,所以輔助功能會很短。但是,這只是我的錯誤,所以我不確定如何最好地解決這個問題。
這是我的雜項類型,其中BaseType
是我所有型號的常見類型。
type DAOMisc =
member internal self.FindIdByType item =
match(item:BaseType) with
| :? StateType as i ->
let a = (StateDAO()).Retrieve i
a.Head.Id
| :? CityType as i ->
let a = (CityDAO()).Retrieve i
a.Head.Id
| _ -> -1
這裏是一個dao類型。 CommonDAO
實際上擁有CRUD操作的代碼,但這並不重要。
type CityDAO() =
inherit CommonDAO<CityType>("city", ["name"; "state_id"],
(fun(reader) ->
[
while reader.Read() do
let s = new CityType()
s.Id <- reader.GetInt32 0
s.Name <- reader.GetString 1
s.StateName <- reader.GetString 3
]), list.Empty
)
這是我的模型類型:
type CityType() =
inherit BaseType()
let mutable name = ""
let mutable stateName = ""
member this.Name with get() = name and set restnameval=name <- restnameval
member this.StateName with get() = stateName and set stateidval=stateName <- stateidval
override this.ToSqlValuesList = [this.Name;]
override this.ToFKValuesList = [StateType(Name=this.StateName);]
此FindIdByType
功能的目的是,我想找到一個外鍵關係的ID,這樣我就可以在我的模型中設定的值然後讓CRUD功能使用所有正確的信息進行操作。因此,City
需要國家名稱的ID,所以我會得到州名稱,將其放入state
類型,然後調用此函數來獲取該州的ID,所以我的城市插入也將包含外部ID鍵。
這似乎是最好的方法,以一種非常通用的方式來處理插入,這是我正在嘗試解決的當前問題。
UPDATE:
我需要研究,看看我能以某種方式注入FindIdByType方法進入CommonDAO所有其他的DAO已經確定之後,幾乎就像是一個封閉。如果這是Java,我會使用AOP來獲得我正在尋找的功能,但不確定如何在F#中執行此操作。
最後更新:
想着我的做法後,我意識到這是致命缺陷,所以我想出了不同的方法。
這是我將如何做插入,我決定把這個想法放入每個實體類,這可能是一個更好的主意。
member self.Insert(user:CityType) =
let fk1 = [(StateDAO().Retrieve ((user.ToFKValuesList.Head :?> StateType), list.Empty)).Head.Id]
self.Insert (user, fk1)
我還沒有開始使用fklist
還,但它是int list
,我知道這列名去與每個人,所以我只需要爲選擇做inner join
,例如。
這是一個廣義的基本類型插入:
member self.Insert(user:'a, fklist) =
self.ExecNonQuery (self.BuildUserInsertQuery user)
這將是很好,如果F#可以做CO /禁忌變化,所以我必須解決這個限制。
參見HTTP://計算器.com/questions/1378575/f-forward-type-declarations – Brian 2010-05-18 02:59:17
@Brian - 直到我想到另外一個問題時,我並沒有考慮過使用幾種類型。對我來說這似乎是一個有缺陷的設計的破解,但我認爲這是最好的方法。 – 2010-05-18 10:33:13