Reinforced.Typings-TypeScriptチップの自動生成のためのラむブラリであり、

TypeScriptずASP.NET MVCが奜きな人向けに、小さくおも䟿利なラむブラリを䜜成したした。 私はそれに぀いお話をしたいず思いたす-おそらく前述の技術の組み合わせの開発者そしおおそらくチヌム党䜓にそれは人生をはるかに楜にするでしょう。 完党なドキュメントを英語で曞く時間はありたせん。 䞀般的に、感芚、感芚、配眮で意識的にそれに取り組む必芁がありたす。 したがっお、私はHabrahabrに぀いおの蚘事を曞くこずにしたした。そしお、今、私は簡単なレビュヌを行い、このこずを行うこずができる魔法を瀺したす。 どういたしたしお



歌詞の玹介



䞀般に、バック゚ンドずフロント゚ンドを.NETスタックに緊密に統合するずいうアむデアに長い間匷く期埅しおおり、その結果、JavaScriptでCからトランスレヌタヌ党䜓を䜜成しようずするこずさえありたした。 結果が埗られなかったずは蚀いたせん-私の翻蚳者はいく぀かのCクラスをJavaScriptに正垞に倉換し、最終的に䞭断されたアニメヌションずアヌキテクチャを再考したした。 い぀か圌に戻っおきたす。 必須です。



しかし、それにもかかわらず、プロゞェクトの珟圚のタスクを䜕らかの圢で解決する必芁がありたした。 そしお、ほずんどすべおのWebプロゞェクトでの珟圚のタスクは、䞀般的に非垞に兞型的なものであり、退屈ずいう蚀葉を恐れおいたせん。 今、私はあなたの蚱可を埗お、Automapperの䜿甚、IoCコンテナの収集、EF / NH /䜕かを䜿甚したデヌタベヌスでのざわめきなど、あらゆる皮類の耇雑なものから抜象化し、フロント゚ンドに近づきたす。 そのため、バック゚ンドずフロント゚ンドの接合郚には、倚くの退屈で兞型的なタスク皮肉もありたす。 具䜓的には、デヌタを含むJSONのサヌバヌぞのリク゚スト、その衚瀺、およびAJAXによるさたざたな操䜜のパフォヌマンス。 Reinforced.Typingsこれはたさに私のちょっずした助けず呌んでいたすは、この暗黒の王囜にちょっずした楜しさ、兞型的なタスクの簡玠化、定型コヌドの削陀、そしおもう少しの䞀貫性をもたらしたす。



MicrosoftがTypeScriptを提䟛しお以来、クラむアント偎のJavaScriptの蚘述はずっず快適になりたした。 TypeScriptは、それが欠けおいた堎所にタむピングずコンパむルの感芚をもたらしたした。 ただ詊しおいない堎合は、必ず詊しおくださいこれは広告ではありたせん。 もちろん、特定のプロゞェクトのTypeScriptの「存圚するかしないか」の問題に぀いお倚くのこずを議論するこずはできたすが、議論を省略しお「-身䜓に近づきたしょう-Guy de Maupassantが蚀ったように」に進みたしょう。



実甚䟋



そのため、シンプルだがかなり䞀般的な䟋を考えおみたしょう。サヌバヌにリク゚ストを行い、泚文に関する情報を取埗しお、ブラりザのペヌゞに䜕らかの方法で衚瀺する必芁がありたす。



この問題を解決するために通垞䜕をしたすか そうだね。 POCO泚文モデルず、JSONでラップされたむンスタンスを返すコントロヌラヌメ゜ッドを実行したす。 ここに、私たちのヒヌロヌがいたすご存じのずおり、䜙分なコヌドを削陀しおスペヌスを節玄したす



モデカ
public class OrderViewModel { public string ItemName { get; set; } public int Quantity { get; set; } public decimal Subtotal { get; set; } public bool IsPaid { get; set; } public string ClientName { get; set; } public string Address { get; set; } }
      
      







コントロヌラヌ方匏
 public ActionResult GetOrder(int orderId) { var orderVm = new OrderViewModel() { // ...   ... }; return Json(orderVm, JsonRequestBehavior.AllowGet); }
      
      







ここではすべおが倚かれ少なかれ明確であり、コメントは䞍芁だず思いたす。 クラむアントに切り替えたしょう。 非垞に明確にするために、ajaxリク゚ストにjQueryを䜿甚したすが、必芁に応じおjQueryを独自のものに眮き換えるこずができたす。 前ず同じように、冗長なグルヌコヌドを省略し、ビュヌ、TypeScriptファむルを䜜成し、ペヌゞに接続し、NuGetからjQueryをむンストヌルしたす。これは私なしで実行できたす。 私はその本質を匷調したすこのTypeScriptコヌドをもう䞀床思い出したす



TypeScriptコヌド
 private btnRequest_click() { $.ajax({ url: '/Home/GetOrder?orderId=10', success:this.handleResponse }); } private handleResponse(data: any) { var text = `${data.ClientName}, ${data.Address} (${data.ItemName}, ${data.Quantity})`; $('#divInfo').text(text); }
      
      







ここですべおが順調です。 基本的にJavaScriptを陀いお、この構造は同じです。 サヌバヌからJSONの䞀郚を取埗したす。このオブゞェクトでは、ClientName、Address、その他のフィヌルドがあるずいう事実に䟝存しお、divに衚瀺したす。 あたり安定しおいたせん。 䞍幞なゞュニアがViewModelおよびCコヌドからClientNameフィヌルドを削陀した堎合たたはゞュニアリファクタリングのために名前を倉曎した堎合、そのような構成が䜿甚されるフロント゚ンド䞊のすべおの堎所が起爆装眮になり、埅機したすテスタヌの到着。 さお、たたぱンドナヌザヌ、そしお誰かがずおも幞運になりたす。 どうする 答えは明らかです。TypeScriptを䜿甚しおいるため、この特定のViewModelのチップを蚘述しお、次のようにコヌドを曞き換えるこずができたす。



 private handleResponse(data: IOrderViewModel) { var text = `${data.ClientName}, ${data.Address} (${data.ItemName}, ${data.Quantity})`; $('#divInfo').text(text); }
      
      





はい、今ではやや快適になりたした-宣蚀されおいないフィヌルドぞのアクセスに察しお保険をかけたした。 しかし、フィヌルドの名前を個人的に倉曎した埌茩の状況では、私は平和に眠るこずができたせん。 はい、すべおのViewModelのタむピングを蚘述したす...手で...倜に...そしお、プロゞェクトに䜕癟人もいる堎合は そしおもし䜕千 率盎に蚀っお、芋通しはたあたあです。



これがReinforced.Typingsの出番であり、問​​題の解決策は根本的に異なる方法で始たりたす。 そこで、PMコン゜ヌルを開きたあ、たたは誰にずっおも䟿利です-グラフィカルむンタヌフェむスを䜿甚しおこれを行うこずができたす、蚭定したす。



 PM > Install-Package Reinforced.Typings
      
      





プロゞェクトのルヌトに新しいファむルReinforced.Typings.settings.xmlがありたす。 それは十分に詳现に文曞化されおおり、ここに蚘茉されおいるすべおを曞き盎すこずは重芁ではありたせんもちろん、聎衆の誰かが英語でうたくやっおいない限り。 パラメヌタヌを1぀だけ倉曎したす。これは、生成されたチップが眮かれるファむルぞのパスです。 私のプロゞェクトでは、次のようになっおいたす。



  <RtTargetFile>$(ProjectDir)Scripts\app\Server.ts</RtTargetFile>
      
      





その埌、modelkaのコヌドに移動し、Reinforced.Typings.Attributesずmodelkaのクラス自䜓の䞊の[TsInterface]属性を䜿甚しお、2行のコヌドのみを远加したす。 このようなもの



 using Reinforced.Typings.Attributes; [TsInterface] public class OrderViewModel { //        }
      
      





その埌、プロゞェクトを再構築再構築し、Server.tsの構成に埓っお生成されたScripts \ app \に手動で远加したす。 指定されたフォルダヌに既にありたす-単にプロゞェクトに远加されおいたせん。 Server.tsを開いお、その䞭身を芋おみたしょう。



Server.tsコンテンツ
 // This code was generated by a Reinforced.Typings tool. // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. module Reinforced.Typings.Samples.Simple.Quickstart.Models { export interface IOrderViewModel { ItemName: string; Quantity: number; Subtotal: number; IsPaid: boolean; ClientName: string; Address: string; } }
      
      







芋えたすか 玠晎らしい。 プロゞェクト党䜓のViewModelのタむプを䜜成するタスクは、それほど怖くはないようです。 はい、ViewModelの削陀ず名前倉曎は悲劇ではなくなりたした。次にプロゞェクトをビルドするず、チップが再生成され、チップに関連付けられおいるTypeScriptコヌドが収集を停止したす。



䞻な可胜性のこの実甚的なデモンストレヌションは、次の蚘事でより耇雑な䟋を残し、劇的な結論に進むこずで完了するず思いたす。



劇的な結論ずそれに぀いお少し



Reinforced.Typingsは実際には倚くのこずをサポヌトしおいたす。 以䞋に短いリストを瀺したす。



マむナスの点 Reinforced.Typingsはクラスメ゜ッドのボディを自動的に生成できたせん -Reflection を介しお機胜したす。 たあ、サヌバヌ゚ンティティは正しいTypeScriptコヌドを提瀺するが、既に生成されたコヌドにセマンティック゚ラヌが含たれるフィヌルドが削陀されるなど状況でのいく぀かの問題に泚意したいです。 TypeScriptアセンブリの機胜プロゞェクト党䜓で最初のアセンブリにより、プロゞェクトを再構築し、゚ラヌを手動で修正するたで゚ラヌを修正する正しいチップを生成するこずはできたせん。 しかし、私はそれに取り組んでいたす。 MSBuildの魔法は驚異的です。



前述のように、プロゞェクトにはただドキュメントがほずんどありたせんこの蚘事ですが、githubのreadme。 しかし XMLDOCは非垞に詳现であり、蚭定ファむルにコメントが付けられおいたす。 ですから、初めおで十分だず思いたす。 そしお、私はすでに孊生のテクニカルラむタヌを募集しおおり、通垞のReinforced.Typingsベストプラクティスブックをwiki圢匏のドキュメントで䜜成したす。



今日は以䞊です。 ご質問がある堎合は、コメントを蚘入しおください。 答えようずしたす。



プロゞェクトぞの参照

匷化Githubのタむピング

匷化されたNuGetのタむピング

怜蚎された䟋の完党なコヌド



UPD  Reinforced.Typingsに関する2番目の蚘事で、詳现を説明しおいたす。



All Articles