這是一個使用S#arp Architecture的MVC 3項目。DataAnnotations具有通用類型的CustomValidator
我的域名有幾個對象繼承NamedEntity
,這是一個抽象類,它擴展了Entity
並定義了string Name
屬性。
所有這些對象都有一個事實,即它們在對象類型中必須是唯一的名稱。
鑑於這些對象的集合相對較小(200將是極端情況),我不介意數據庫的往返檢查是否有重複。
我的問題是,什麼是最好的方式來輕鬆驗證這一點,同時保持乾爽?
我已經經歷了六次迭代,並不特別喜歡它們中的任何一個。我已經嘗試在ViewModel上創建[ValidUniqueName]
屬性,並且可以鍵入ViewModel EditViewModel<T> where T: NamedEntity
。問題在於該屬性由於Generic而不知道要與之通話的正確的存儲庫/任務對象。
爲了解決這個問題,我嘗試在ViewModel中創建一個INamedEntityTasks<T>
引用,並從ValidationContext
中爲ValidUniqueName
屬性訪問它。這不符合預期,因爲屬性不是通用的(不能),因此它不知道如何正確地將ValidationContext.ObjectInstance
轉換回可用的東西。
在這一點上,我能想到的唯一的事情是創建單獨的[ValidUniqueFoo]
[ValidUniqueBar]
等屬性,這似乎是不好的。或者,我可以將驗證放在每個控制器中,但看起來同樣很糟糕。
這看起來不錯,但我相信你可以做出更通用的。我需要考慮那一個。 – simonlchilds
讓我知道你想出了什麼!我非常想找到更通用的解決方案。如果'tasks'沒有被正確輸入(例如,如果它被輸入爲「NamedEntity」的基礎名稱),則可能得到誤報(您有一個名爲Foo的類別,但它不會讓您創建一個名爲Foo的城市)。嘗試修改'CheckForDuplicateName'來接受'NamedEntity'對象和比較類型,但'typeof(City)'不匹配'typeof(NamedEntity)',所以這也不起作用 –
我到了那裏!但是我得到了錯誤的消極信息,我會在發現更多信息後發佈更多信息。 – simonlchilds