我甚至不知道我的措辭問題的權利,但我會嘗試用一個例子儘可能清楚地解釋:如何在JavaScript中強制輸入映射到C#模型的屬性?
在下面的示例場景:
1)取一類這樣的因爲這個:
public class foo
{
public string firstName {get;set;}
public string lastName {get;set}
}
2)將它序列化成JSON,將它通過網絡傳遞給瀏覽器。
3)瀏覽器反序列化這一點,變成了JSON轉換爲JavaScript對象,這樣你就可以像這樣訪問屬性:
var foo = deSerialize("*******the JSON from above**************");
alert(foo.firstName);
alert(foo.lastName);
如果現在有什麼新的開發者來一起工作此項目決定firstName
不再是合適的屬性名稱。假設他們使用ReSharper來重命名此屬性,因爲ReSharper在找到(幾乎)所有對該屬性的引用並進行相應的重命名方面做得非常好。
但是ReSharper將無法重命名JavaScript代碼(#3)中的引用,因爲它無法知道這些引用也確實意味着同一件事。這意味着程序員有責任手動找到這些引用並重命名這些引用。
風險在於,如果忘記了這一點,那麼除非有人測試代碼的一部分,否則沒有人會知道這個錯誤,或者更糟的是,直接傳遞給客戶。
回到實際的問題: 我一直在努力想解決這一些如何強類型這些屬性名稱在JavaScript中使用時,讓喜歡ReSharper的一個工具可以成功地重新命名所有財產(和準確)的用法?
這是我一直在思考,例如(這顯然是不行的,除非我做出某種靜態屬性)
var foo = deSerialize("*******the JSON from above**************");
alert(foo.<%=foo.firstName.GetPropertyName()%>)
alert(foo.<%=foo.lastName.GetPropertyName()%>)
但是,這顯然是不實際的。有沒有人有這個想法?
謝謝,並感謝所有有才華的人在本網站上回答問題。
這是我的一個實驗,所以任何建議都會受到歡迎。
是的ReSharper確實有這個選擇,但它無法在我的情況下找到它。此外,即使這樣做,也可能會混淆該字符串的其他用法,即使它與該字符串無關。我同意你關於集成測試的意見,但我想試着從源頭上解決問題,而不是等待測試來揭示問題。沒什麼大不了的,這更像是一個實驗。 – 7wp 2010-04-07 18:42:16
然後,我會在最後一行建議:不要將JSON耦合到類型系統,要爲C#和JS理解的JSON創建一個單獨的約定,並且只有在有人進行刻意時纔會受到影響改變它。 – 2010-04-07 19:17:26
沒錯,但是當有人對它進行了有意的改變時,他們是否會發現自己處於與我指出的那種情景?特別是如果它在遍佈各地的許多地方使用? – 7wp 2010-04-07 20:37:26