के कारण एफ # प्रकारों को ऑर्डर करने में समस्या का निर्धारण करने में समस्या मेरे पास कुछ प्रकार हैं जो एक सामान्य प्रकार का विस्तार करते हैं, और ये मेरे मॉडल हैं।परिपत्र संदर्भ
मेरे पास सीआरयूडी संचालन के लिए प्रत्येक मॉडल प्रकार के लिए डीएओ प्रकार हैं।
अब मुझे एक फ़ंक्शन की आवश्यकता है जो मुझे किसी भी मॉडल प्रकार को आईडी खोजने की अनुमति देगी, इसलिए मैंने कुछ विविध कार्यों के लिए एक नया प्रकार बनाया।
समस्या यह है कि मुझे नहीं पता कि इन प्रकारों को कैसे ऑर्डर करना है। वर्तमान में मेरे पास दाओ से पहले मॉडल हैं, लेकिन मुझे DAOMisc
CityDAO
और CityDAO
से पहले DAOMisc
से पहले DAOMisc
की आवश्यकता है, जो संभव नहीं है।
सरल दृष्टिकोण प्रत्येक डीएओ में इस समारोह डाल करने के लिए, बस प्रकार है कि यह पहले आ सकता है की चर्चा करते हुए होगा, इसलिए, 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
यहाँ एक दाव प्रकार है। CommonDAO
वास्तव में सीआरयूडी संचालन के लिए कोड है, लेकिन यह यहां महत्वपूर्ण नहीं है।
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
समारोह के लिए उद्देश्य है कि मैं एक विदेशी कुंजी रिश्ते के लिए आईडी लगाना चाहते है, इसलिए मैं अपने मॉडल में मूल्य निर्धारित कर सकते हैं और तो सीआरयूडी कार्य सभी सही जानकारी के साथ संचालन करते हैं। इसलिए, City
को राज्य के नाम के लिए आईडी की आवश्यकता है, इसलिए मुझे राज्य का नाम मिल जाएगा, इसे state
प्रकार में डालें, फिर उस स्थिति के लिए आईडी प्राप्त करने के लिए इस फ़ंक्शन को कॉल करें, इसलिए मेरे शहर सम्मिलन में विदेशी के लिए आईडी भी शामिल होगी कुंजी।
यह सम्मिलित करने के लिए एक बहुत ही सामान्य तरीके से सबसे अच्छा तरीका प्रतीत होता है, जो वर्तमान समस्या है जिसे मैं हल करने की कोशिश कर रहा हूं।
अद्यतन:
मैं अनुसंधान और अगर मैं किसी भी तरह अन्य सभी DAOs परिभाषित किया गया है के बाद CommonDAO में FindIdByType विधि इंजेक्षन कर सकते हैं, लगभग जैसे कि यह एक बंद है को देखने के लिए की जरूरत है। यदि यह जावा था तो मैं उस कार्यक्षमता को प्राप्त करने के लिए एओपी का उपयोग करूंगा जो मैं खोज रहा हूं, निश्चित नहीं है कि यह 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)
यह अच्छा होगा अगर एफ # सह/विपरीत विचरण कर सकता है, इसलिए मुझे लगता है कि सीमा के आसपास काम करने के लिए किया था।
भी देखें http उपयोग कर रहा है: निम्नलिखित चिकन/अंडा प्रकार परिभाषा पर विचार करें .com/प्रश्न/1378575/एफ-फॉरवर्ड-टाइप-घोषणाएं – Brian
@ ब्रायन - जब तक मैंने इस अन्य प्रश्न के बारे में सोचा नहीं, मैंने केवल कई प्रकार के उपयोग और विचार करने पर विचार नहीं किया। ऐसा लगता है कि मेरे हिस्से पर एक दोषपूर्ण डिजाइन के लिए एक हैक है, लेकिन मुझे लगता है कि यह सबसे अच्छा तरीका है। –