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

61
業務アプリケーション開発 を支える.NET技術 2015/10/10 - # ngtnet TAKANO Sho (高野 将)/ @ masaru_b_cl

Upload: -

Post on 12-Apr-2017

3.746 views

Category:

Engineering


0 download

TRANSCRIPT

業務アプリケーション開発

を支える.NET技術

2015/10/10 - #ngtnet

TAKANO Sho(高野 将)/ @masaru_b_cl

自己紹介

某SIerで働くDeveloper

そのかたわら執筆業も

#ngtnet 2

近況

#ngtnet 3

今日お話すること

顧客企業の基幹システムを始めとした

業務アプリケーションを開発する際の

諸問題を解決するために使用できる

.NET関連の標準テクノロジーを紹介します

#ngtnet 4

今日お話しないこと

サードパーティのライブラリ、ツール

ASP.NET 5や.NET Core、DNXといった

最新情報

Microsoft Azure

#ngtnet 5

お願い

なるべくわかりやすく説明するつもりですが、

疑問、確認、ちょっと待って!などあれば、

その場で気軽に挙手を!

#ngtnet 6

背景説明

#ngtnet 7

ユーザーの要求

画面にたくさん項目並べて一気に入力したい

100人単位で使いたい

サーバーは自社のデータセンターに置きたい

職権によって使える機能制限したい

etc...

#ngtnet 8

開発体制

複数社、複数拠点による合同開発

サブシステム単位で分担

開発者のスキルレベルはまちまち

強い「こだわり」を持っている

経験が浅い

昨今の流れに明るくない、etc…

#ngtnet 9

アーキテクチャの選択

Windowsフォームを使った

3階層リッチクライアントアプリケーション

#ngtnet 10

※.NET におけるアプリケーション アーキテクチャ ガイド 2.0 - 第19章 : 物理ティアと配置 よりhttp://www.microsoft.com/ja-jp/dev/2010/solutions/architecture/default.aspx

選択理由

クライアント側であれこれしたいので

Webアプリだと辛い

WPFは教育コストが回収できない

クラサバでやるにはちょっと重い

#ngtnet 11

求められること

簡単に配布できる

複数拠点の成果物を集約できる

低スキル者でも無理なく開発を始められる

#ngtnet 12

それでは始めましょう

まずは開発プロセスの運用寄りの

ところからお話します

#ngtnet 13

ライブラリの配布

#ngtnet 14

ライブラリの配布

従来は…

dllファイルやソースファイルをそのまま配布

依存関係のあるライブラリ配布が漏れる

問題が発生したバージョンが特定できない

ライブラリ更新が漏れる

#ngtnet 15

dllファイルを直接配布

#ngtnet 16

※チーム開発でもパッケージ管理を容易に! NuGetを活用してライブラリを効果的に配布しようhttp://codezine.jp/article/detail/8735 より

ライブラリ配布あるある

なんかうまく動かないんですが

こっちでは大丈夫なので、dllファイルの日付教

えて下さい

なんかうまく動かないんですが

Hoge.dllが増えたので追加してください

なんか(ry

#ngtnet 17

NuGetの利用

NuGet

https://www.nuget.org/

“NuGet is the package manager for the Microsoft

development platform including .NET. ”

(NuGetは.NETを含むマイクロソフトの

開発プラットフォーム向けパッケージマネージャーです)

#ngtnet 18

パッケージマネージャーとは

ライブラリの導入をサポートし、

管理するためのツール

ライブラリをパッケージとしてまとめる

バージョン、依存する他のパッケージなどの情報を含む

パッケージはリポジトリーに登録する

リポジトリーからパッケージを追加、更新、削除する

#ngtnet 19

NuGetの利用

依存関係のあるライブラリ配布が漏れる

⇒ 依存パッケージも一緒に導入される

問題が発生したバージョンが特定できない

⇒ パッケージにはバージョンが必須

ライブラリ更新が漏れる

⇒ ツールから更新可能

#ngtnet 20

NuGetによる配布

#ngtnet 21

※チーム開発でもパッケージ管理を容易に! NuGetを活用してライブラリを効果的に配布しようhttp://codezine.jp/article/detail/8735 より

NuGetのさらなる活用

ライブラリだけでなく業務機能も

NuGetパッケージで管理する

不具合対応などを行う際の対象バージョンが

明確になる

機能間の循環参照を検知及び防止できる

(循環参照:相互に依存関係がある状態)

#ngtnet 22

NuGet利用時の注意

バージョン運用ルールを定め、

順守する必要がある

例)異なるソースで同一バージョンの

パッケージを作らない

「プロジェクト参照」よりは手軽ではない

例) 利用パッケージのデバッグが気軽に行えない

#ngtnet 23

NuGetについてより詳しく

実例に学ぶチーム開発におけるNuGet導入のすすめ

http://codezine.jp/article/corner/587

“NuGetを使うと多くのOSSライブラリを手軽に導入できるため、非常

に便利です。しかし、NuGetの真髄はライブラリの導入ではなく、

「パッケージ管理」にあります。本稿では、チーム開発における諸問

題を解決するために、NuGetがどのように使えるか、実例を元に紹介

していきます。”

#ngtnet 24

チーム成果物の集約

#ngtnet 25

チーム成果物の集約

複数拠点で開発した成果物は最終的には

一つになる

一番最後だけでまとめようとすると

大変なことに…

ビルドできません!

足りません!

ルール無視しまくってます! etc...

#ngtnet 26

こんなことが起きないためには

定期的に成果物を集めるようにする

集めた成果物を随時チェックする

ビルドエラーにならないか

ルールに則っているか

動作が変でないか

#ngtnet 27

どうやってチェックするか

自動ビルドを活用する

すべての成果物を一からビルドする

コード分析ツールでチェックする

自動テストツールでテストする

ビルド成果物をテスト環境に配置する

#ngtnet 28

MSBuildの利用

MSBuild

https://msdn.microsoft.com/ja-jp/library/dd393574.aspx

“Microsoft Build Engine は、アプリケーションを

ビルドするためのプラットフォームです。”

#ngtnet 29

MSBuildの利用

.NETアプリケーションのビルドが、

Visual Studioがなくてもできる

ビルド以外の外部コマンドも実行できる

コード分析

自動テスト etc…

ビルド成果物のコピーや「発行」ができる

#ngtnet 30

いつビルド環境をつくるか

実際に開発に入る前一択

あとでビルドスクリプト拵えるのは困難

あとで文化を付け足すのも困難

#ngtnet 31

どうやって定期的に行うか

Jenkins等のCIツール

Windowsのタスクスケジューラー

Team Foundation Server /

Visual Studio Online

#ngtnet 32

個人的おすすめ

MSBuildを使ってビルドを行う

batファイルを作成しておく

好みの定期実行ツールで実行する

必要なら手動で実行する

配布が必要ならテスト環境/本番環境など、

環境ごとにbatファイルを分ける

構成情報の切替をbatファイルで行う

#ngtnet 33

余談:自動テスト

VSについてくるMSTestが使える

.NET Frameworkには含まれないので注意

MSBuildではMSTestの実行ファイルを

外部コマンドとして実行する

#ngtnet 34

ちょっと一休み

ここまでは開発プロセスの運用に

近い方の話でしたが、

ここからは実装寄りの話をします。

#ngtnet 35

メニューの実現

#ngtnet 36

メニューに求められること

使用したい機能を選択できる

選んだ機能を起動できる

機能の増減に対応できる

要件の変更

職権による制限

#ngtnet 37

どうやって実現するか

Webアプリケーションなら…

機能別にURLを設定

画面に上記URLを設定した

ハイパーリンクを表示

#ngtnet 38

どうやって実現するか

Windowsフォームアプリケーションでは…

機能毎にフォームクラスを定義

メニューでは上記フォームクラスの

インスタンスを動的に作成、表示

#ngtnet 39

動的なフォーム作成

以前は…

機能ごとに以下の情報を管理

アセンブリ名

クラス名

リフレクションで動的にロード、インスタンス作成

Assembly.LoadFromメソッド

#ngtnet 40

リフレクションの利用

DEMOhttps://github.com/masaru-b-cl/ngtnet-2015-10/tree/master/MEFSample/MEFSample.Reflection

#ngtnet 41

リフレクションの問題

管理項目が多い

アセンブリのファイル名、名前空間を含むクラス名、etc…

型安全でない

文字列での指定、ダウンキャスト、etc…

コードが煩雑

定形といえば定形だけど…

#ngtnet 42

MEFの利用

MEF

(Managed Extensibility Framework)

https://msdn.microsoft.com/ja-jp/library/dd460648.aspx

“Managed Extensibility Framework (MEF) は、

軽量で拡張可能なアプリケーションを作成するた

めのライブラリです。”

#ngtnet 43

MEFの利用

#ngtnet 44

root

plugins

Application.exe

Hoge.dll

Fuga.dll

コンテナーインポート

カタログ

エクスポート

エクスポート

機能名: Hoge

機能名: Fuga

MEFの利用

DEMOhttps://github.com/masaru-b-cl/ngtnet-2015-10/tree/master/MEFSample/MEFSample.Menu

#ngtnet 45

MEFの利点

機能の「名前」だけ管理すれば良い

型安全に扱える

呼び出しコードがシンプル

#ngtnet 46

リモート呼び出し方法

#ngtnet 47

リモート呼び出し方法

三階層リッチクライアントアプリでは、

APサーバーに対するリモート呼び出しが必要

直接DBサーバーにアクセスしない

APサーバーが公開するAPIを利用して

データ取得や更新といった処理を実行

#ngtnet 48

リモート呼び出し方法

#ngtnet 49

クライアントPC APサーバー DBサーバー

DBMSサービス

AP

クライアント

AP

リモート呼び出し

.NETにおけるリモート呼び出し

.NET Remoting

TCP/IPなどを用いた比較的低レベルなデータやりとり

ASP.NET XML Webサービス

SOAPに基づいたHTTP(S)でのXMLデータやりとり

ASP.NET Web API

HTTP(S)でのJSON等のデータやりとり

WCF

通信プロトコル、データ形式などを選べるデータやりとり

#ngtnet 50

WCFの利用

WCF

(Windows Communication Foundation)

https://msdn.microsoft.com/ja-jp/library/ms731082.aspx

“Windows Communication Foundation (WCF) は、

サービス指向アプリケーションを構築するためのフ

レームワークです。”

#ngtnet 51

WCFの概要

#ngtnet 52

※WCF:WCFの概要図を作成してみました | be free

https://takanosho.wordpress.com/2012/03/06/wcf-image-diagram/ より

WCFの利点

VS統合のクライアントコード自動生成

VS上でサービスのエンドポイントを選んだ後、数ステップで可能

*.svcファイルとdllファイルを置くだけの簡単配置

Webサイトにサービス定義のsvcファイルとサービス実装コードを含む

dllファイルを配置するだけ

#ngtnet 53

WCFの利用

DEMOhttps://github.com/masaru-b-cl/ngtnet-2015-10/tree/master/WCFSample

#ngtnet 54

実プロジェクトでの運用

#ngtnet 55

実プロジェクトでの運用

実プロジェクトではこれらの技術、ノウハウ

を組み合わせて開発プロセスを設計する

コーディングガイドライン

成果物のやり取りルール

テンプレートの作成

サンプルの作成 etc…

#ngtnet 56

実プロジェクトでの運用

間違えにくいように設計する

想定した手順は簡単に

想定外の手順は難しく

間違っても簡単にやり直せるように

言うは易し、行うは難し

開発の中でプロセスも成長させていく

#ngtnet 57

まとめ

#ngtnet 58

まとめ

.NETやVSに付属している各種の

標準テクノロジー群は便利

必要ならさらにOSSなどの導入を

実際に大事なのは

どう組み合わせて設計するか

対象アプリに合わせたフレームワーク設計、

開発プロセス運用を

#ngtnet 59

業務アプリケーション開発

を支える.NET技術

2015/10/10 - #ngtnet

TAKANO Sho(高野 将)/ @masaru_b_cl

ありがとうございました!#ngtnet 60

質疑応答

わからないこと、

聞き逃したことなど、

お気軽に質問どうぞ!

#ngtnet 61