2010-04-30 65 views
-1

使用簡單字符串作爲查詢參數來查詢數據庫實體的好做法被認爲是一種良好做法。誰應該實現將字符串「轉換」爲實體的方法,以及誰應該調用此方法?存儲庫,實體或其他對象,就像MVC應用程序中的控制器一樣?通過自定義字符串從存儲庫獲取實體

對於更具體的例子,我有一個ASP.NET MVC 2應用程序,使用Sharp Architecture的IRepositorySharpModelBinder。後者的配置是這樣的,即如果用戶提交了一個表單,該表單有一個ID代替一個對象,那麼它將查詢具有相同ID的對象的相應存儲庫。我想添加到這個例子不僅能夠使用一個ID,但也是一個自定義字符串。當然,從通用查詢字符串獲取具體ID的方法對於每個Repository/Entity都是不同的。我應該怎麼做?

更加具體。假設我有兩個實體:

class Doctor : Entity { 
    public virtual Patient ActualPatient { get; set; }; 
    // some other properties, constructor, etc. 
} 

class Patient : Entity { 
    // some properties, constructor, etc. 
} 

現在,如果我對醫生實體的編輯器(如表格),我可以代替Doctor.ActualPatient的輸入ID和模型綁定將採取分配的護理適當的對象。但是如果用戶輸入一個自定義字符串(如Patient的名稱)呢?

這裏是我目前的選擇:

  1. 控制器應藉此自定義字符串的照顧。所以後ModelBinder的不能結合的PatientDoctor(=用於Patient返回null)時,控制器採取串和使用一些algorythm它會嘗試獲取由該字符串表示的患者(或失敗太)
  2. 該控制器負責的這一點,但要求被定義別的地方不是在控制器類中的方法(看下一題)
  3. 的ModelBinder的應配置爲使用這個外部方法
  4. 你不應該這樣做這,這總是被認爲是不好的做法
  5. 別的東西(建議,歡迎)

而且這裏是我在哪裏此方法應執行的建議:

  1. 存儲庫應該有一個GetEntityFromAString(string)方法,併爲這個倉庫的子類應該重新定義此方法。
  2. 實體應該有一個屬性,如果目前負責這個轉換,以及控制器/模型綁定器的/ etc這個屬性的檢查,並呼籲像GetEntityFromAStringUsingThisRepository(string,repository)
  3. 的方法我已經說過,這是一個不好的做法
  4. 別的東西

雖然具體的例子是夏普建築/ ASP.NET MVC2/NHibernate的隨​​意普遍回答。

感謝您的答案。

+0

聽起來社區維基... – RedFilter 2010-04-30 14:56:30

+0

你爲什麼這麼認爲? – SztupY 2010-04-30 15:23:49

回答

1

我會明確地從控制器管理這個。

如果通過ID進行綁定,則可以保證您將獲得實例,如果未找到,則可以爲null。但是,綁定任意屬性並不那麼簡單:如果有多個匹配,會怎麼樣?綁定器應該拋出異常嗎?它應該只返回第一個結果嗎?正如你所看到的,很容易遇到意想不到的結果,因此違反了principle of least astonishment

如果你真的知道你在做什麼,你想要這個,我想創建一個與相關屬性的定製綁定,這將有屬性的名稱使用查找實體,例如

class Patient { 
    int Id {get;set;} 
    string PatientName {get;set;} 
} 
... 
ActionResult SomeAction([MyCustomBinder("PatientName")] Patient patient) {...} 
+0

是的,但是通過將例如邏輯添加到您實際上正在說的Repository類中,知識庫應該知道如何處理這種情況。還是你說存儲庫不應該包含這樣的邏輯?添加諸如要搜索哪個屬性的東西也不好,因爲可能會檢查多個屬性。如何將字符串「轉換」爲實體的邏輯可能要複雜得多,這可能實際上需要查詢數據庫。 – SztupY 2010-04-30 20:40:11

+0

@SztupY:我不確定我是否理解你在說什麼......當然,實際的提取是委託給Repository的。如果你需要比這更復雜的東西,那麼你肯定*不想在活頁夾中做這件事,就像我在回答開始時所說的那樣。 – 2010-04-30 21:24:49

+0

是的,但活頁夾實際上是調用存儲庫來獲取ID。如果它可以使用存儲庫的「getID」方法,爲什麼不能使用另一種方法,比如「GetEntityFromName」呢?爲什麼將這個調用委託給控制器是一個不好的主意,但是將模型綁定器中的ID保存到一個好的? – SztupY 2010-04-30 21:43:49

相關問題