我有一些扩展常见类型的类型,这些是我的模型。由于循环引用而决定如何订购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