Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

業務アプリケーション開発を支える.NET技術 #ngtnet

5 454 vues

Publié le

Niigata.NET 2015-10の発表資料です。

Publié dans : Ingénierie
  • Soyez le premier à commenter

業務アプリケーション開発を支える.NET技術 #ngtnet

  1. 1. 業務アプリケーション開発 を支える.NET技術 2015/10/10 - #ngtnet TAKANO Sho(高野 将)/ @masaru_b_cl
  2. 2. 自己紹介 某SIerで働くDeveloper そのかたわら執筆業も #ngtnet 2
  3. 3. 近況 #ngtnet 3
  4. 4. 今日お話すること 顧客企業の基幹システムを始めとした 業務アプリケーションを開発する際の 諸問題を解決するために使用できる .NET関連の標準テクノロジーを紹介します #ngtnet 4
  5. 5. 今日お話しないこと サードパーティのライブラリ、ツール ASP.NET 5や.NET Core、DNXといった 最新情報 Microsoft Azure #ngtnet 5
  6. 6. お願い なるべくわかりやすく説明するつもりですが、 疑問、確認、ちょっと待って!などあれば、 その場で気軽に挙手を! #ngtnet 6
  7. 7. 背景説明 #ngtnet 7
  8. 8. ユーザーの要求 画面にたくさん項目並べて一気に入力したい 100人単位で使いたい サーバーは自社のデータセンターに置きたい 職権によって使える機能制限したい etc... #ngtnet 8
  9. 9. 開発体制 複数社、複数拠点による合同開発 サブシステム単位で分担 開発者のスキルレベルはまちまち 強い「こだわり」を持っている 経験が浅い 昨今の流れに明るくない、etc… #ngtnet 9
  10. 10. アーキテクチャの選択 Windowsフォームを使った 3階層リッチクライアントアプリケーション #ngtnet 10 ※.NET におけるアプリケーション アーキテクチャ ガイド 2.0 - 第19章 : 物理ティアと配置 より http://www.microsoft.com/ja-jp/dev/2010/solutions/architecture/default.aspx
  11. 11. 選択理由 クライアント側であれこれしたいので Webアプリだと辛い WPFは教育コストが回収できない クラサバでやるにはちょっと重い #ngtnet 11
  12. 12. 求められること 簡単に配布できる 複数拠点の成果物を集約できる 低スキル者でも無理なく開発を始められる #ngtnet 12
  13. 13. それでは始めましょう まずは開発プロセスの運用寄りの ところからお話します #ngtnet 13
  14. 14. ライブラリの配布 #ngtnet 14
  15. 15. ライブラリの配布 従来は… dllファイルやソースファイルをそのまま配布 依存関係のあるライブラリ配布が漏れる 問題が発生したバージョンが特定できない ライブラリ更新が漏れる #ngtnet 15
  16. 16. dllファイルを直接配布 #ngtnet 16 ※チーム開発でもパッケージ管理を容易に! NuGetを活用してライブラリを効果的に配布しよう http://codezine.jp/article/detail/8735 より
  17. 17. ライブラリ配布あるある なんかうまく動かないんですが こっちでは大丈夫なので、dllファイルの日付教 えて下さい なんかうまく動かないんですが Hoge.dllが増えたので追加してください なんか(ry #ngtnet 17
  18. 18. NuGetの利用 NuGet https://www.nuget.org/ “NuGet is the package manager for the Microsoft development platform including .NET. ” (NuGetは.NETを含むマイクロソフトの 開発プラットフォーム向けパッケージマネージャーです) #ngtnet 18
  19. 19. パッケージマネージャーとは ライブラリの導入をサポートし、 管理するためのツール ライブラリをパッケージとしてまとめる バージョン、依存する他のパッケージなどの情報を含む パッケージはリポジトリーに登録する リポジトリーからパッケージを追加、更新、削除する #ngtnet 19
  20. 20. NuGetの利用 依存関係のあるライブラリ配布が漏れる ⇒ 依存パッケージも一緒に導入される 問題が発生したバージョンが特定できない ⇒ パッケージにはバージョンが必須 ライブラリ更新が漏れる ⇒ ツールから更新可能 #ngtnet 20
  21. 21. NuGetによる配布 #ngtnet 21 ※チーム開発でもパッケージ管理を容易に! NuGetを活用してライブラリを効果的に配布しよう http://codezine.jp/article/detail/8735 より
  22. 22. NuGetのさらなる活用 ライブラリだけでなく業務機能も NuGetパッケージで管理する 不具合対応などを行う際の対象バージョンが 明確になる 機能間の循環参照を検知及び防止できる (循環参照:相互に依存関係がある状態) #ngtnet 22
  23. 23. NuGet利用時の注意 バージョン運用ルールを定め、 順守する必要がある 例)異なるソースで同一バージョンの パッケージを作らない 「プロジェクト参照」よりは手軽ではない 例) 利用パッケージのデバッグが気軽に行えない #ngtnet 23
  24. 24. NuGetについてより詳しく 実例に学ぶチーム開発におけるNuGet導入のすすめ http://codezine.jp/article/corner/587 “NuGetを使うと多くのOSSライブラリを手軽に導入できるため、非常 に便利です。しかし、NuGetの真髄はライブラリの導入ではなく、 「パッケージ管理」にあります。本稿では、チーム開発における諸問 題を解決するために、NuGetがどのように使えるか、実例を元に紹介 していきます。” #ngtnet 24
  25. 25. チーム成果物の集約 #ngtnet 25
  26. 26. チーム成果物の集約 複数拠点で開発した成果物は最終的には 一つになる 一番最後だけでまとめようとすると 大変なことに… ビルドできません! 足りません! ルール無視しまくってます! etc... #ngtnet 26
  27. 27. こんなことが起きないためには 定期的に成果物を集めるようにする 集めた成果物を随時チェックする ビルドエラーにならないか ルールに則っているか 動作が変でないか #ngtnet 27
  28. 28. どうやってチェックするか 自動ビルドを活用する すべての成果物を一からビルドする コード分析ツールでチェックする 自動テストツールでテストする ビルド成果物をテスト環境に配置する #ngtnet 28
  29. 29. MSBuildの利用 MSBuild https://msdn.microsoft.com/ja-jp/library/dd393574.aspx “Microsoft Build Engine は、アプリケーションを ビルドするためのプラットフォームです。” #ngtnet 29
  30. 30. MSBuildの利用 .NETアプリケーションのビルドが、 Visual Studioがなくてもできる ビルド以外の外部コマンドも実行できる コード分析 自動テスト etc… ビルド成果物のコピーや「発行」ができる #ngtnet 30
  31. 31. いつビルド環境をつくるか 実際に開発に入る前一択 あとでビルドスクリプト拵えるのは困難 あとで文化を付け足すのも困難 #ngtnet 31
  32. 32. どうやって定期的に行うか Jenkins等のCIツール Windowsのタスクスケジューラー Team Foundation Server / Visual Studio Online #ngtnet 32
  33. 33. 個人的おすすめ MSBuildを使ってビルドを行う batファイルを作成しておく 好みの定期実行ツールで実行する 必要なら手動で実行する 配布が必要ならテスト環境/本番環境など、 環境ごとにbatファイルを分ける 構成情報の切替をbatファイルで行う #ngtnet 33
  34. 34. 余談:自動テスト VSについてくるMSTestが使える .NET Frameworkには含まれないので注意 MSBuildではMSTestの実行ファイルを 外部コマンドとして実行する #ngtnet 34
  35. 35. ちょっと一休み ここまでは開発プロセスの運用に 近い方の話でしたが、 ここからは実装寄りの話をします。 #ngtnet 35
  36. 36. メニューの実現 #ngtnet 36
  37. 37. メニューに求められること 使用したい機能を選択できる 選んだ機能を起動できる 機能の増減に対応できる 要件の変更 職権による制限 #ngtnet 37
  38. 38. どうやって実現するか Webアプリケーションなら… 機能別にURLを設定 画面に上記URLを設定した ハイパーリンクを表示 #ngtnet 38
  39. 39. どうやって実現するか Windowsフォームアプリケーションでは… 機能毎にフォームクラスを定義 メニューでは上記フォームクラスの インスタンスを動的に作成、表示 #ngtnet 39
  40. 40. 動的なフォーム作成 以前は… 機能ごとに以下の情報を管理 アセンブリ名 クラス名 リフレクションで動的にロード、インスタンス作成 Assembly.LoadFromメソッド #ngtnet 40
  41. 41. リフレクションの利用 DEMO https://github.com/masaru-b-cl/ngtnet-2015-10/tree/master/MEFSample/MEFSample.Reflection #ngtnet 41
  42. 42. リフレクションの問題 管理項目が多い アセンブリのファイル名、名前空間を含むクラス名、etc… 型安全でない 文字列での指定、ダウンキャスト、etc… コードが煩雑 定形といえば定形だけど… #ngtnet 42
  43. 43. MEFの利用 MEF (Managed Extensibility Framework) https://msdn.microsoft.com/ja-jp/library/dd460648.aspx “Managed Extensibility Framework (MEF) は、 軽量で拡張可能なアプリケーションを作成するた めのライブラリです。” #ngtnet 43
  44. 44. MEFの利用 #ngtnet 44 root plugins Application.exe Hoge.dll Fuga.dll コンテナー インポート カタログ エクスポート エクスポート 機能名: Hoge 機能名: Fuga
  45. 45. MEFの利用 DEMO https://github.com/masaru-b-cl/ngtnet-2015-10/tree/master/MEFSample/MEFSample.Menu #ngtnet 45
  46. 46. MEFの利点 機能の「名前」だけ管理すれば良い 型安全に扱える 呼び出しコードがシンプル #ngtnet 46
  47. 47. リモート呼び出し方法 #ngtnet 47
  48. 48. リモート呼び出し方法 三階層リッチクライアントアプリでは、 APサーバーに対するリモート呼び出しが必要 直接DBサーバーにアクセスしない APサーバーが公開するAPIを利用して データ取得や更新といった処理を実行 #ngtnet 48
  49. 49. リモート呼び出し方法 #ngtnet 49 クライアントPC APサーバー DBサーバー DBMS サービス AP クライアント AP リモート 呼び出し
  50. 50. .NETにおけるリモート呼び出し .NET Remoting TCP/IPなどを用いた比較的低レベルなデータやりとり ASP.NET XML Webサービス SOAPに基づいたHTTP(S)でのXMLデータやりとり ASP.NET Web API HTTP(S)でのJSON等のデータやりとり WCF 通信プロトコル、データ形式などを選べるデータやりとり #ngtnet 50
  51. 51. WCFの利用 WCF (Windows Communication Foundation) https://msdn.microsoft.com/ja-jp/library/ms731082.aspx “Windows Communication Foundation (WCF) は、 サービス指向アプリケーションを構築するためのフ レームワークです。” #ngtnet 51
  52. 52. WCFの概要 #ngtnet 52 ※WCF:WCFの概要図を作成してみました | be free https://takanosho.wordpress.com/2012/03/06/wcf-image-diagram/ より
  53. 53. WCFの利点 VS統合のクライアントコード自動生成 VS上でサービスのエンドポイントを選んだ後、数ステップで可能 *.svcファイルとdllファイルを置くだけの簡単配置 Webサイトにサービス定義のsvcファイルとサービス実装コードを含む dllファイルを配置するだけ #ngtnet 53
  54. 54. WCFの利用 DEMO https://github.com/masaru-b-cl/ngtnet-2015-10/tree/master/WCFSample #ngtnet 54
  55. 55. 実プロジェクトでの運用 #ngtnet 55
  56. 56. 実プロジェクトでの運用 実プロジェクトではこれらの技術、ノウハウ を組み合わせて開発プロセスを設計する コーディングガイドライン 成果物のやり取りルール テンプレートの作成 サンプルの作成 etc… #ngtnet 56
  57. 57. 実プロジェクトでの運用 間違えにくいように設計する 想定した手順は簡単に 想定外の手順は難しく 間違っても簡単にやり直せるように 言うは易し、行うは難し 開発の中でプロセスも成長させていく #ngtnet 57
  58. 58. まとめ #ngtnet 58
  59. 59. まとめ .NETやVSに付属している各種の 標準テクノロジー群は便利 必要ならさらにOSSなどの導入を 実際に大事なのは どう組み合わせて設計するか 対象アプリに合わせたフレームワーク設計、 開発プロセス運用を #ngtnet 59
  60. 60. 業務アプリケーション開発 を支える.NET技術 2015/10/10 - #ngtnet TAKANO Sho(高野 将)/ @masaru_b_cl ありがとうございました! #ngtnet 60
  61. 61. 質疑応答 わからないこと、 聞き逃したことなど、 お気軽に質問どうぞ! #ngtnet 61

×