この記事では、ASP.NET MVC 3テクノロジーに基づいたWebアプリケーションの機能プロトタイプを迅速に作成する可能性を検討したいと思います。 メインアプリケーションフレームワークをすばやく生成する方法。 これにより、開発者はビジネスモデルの作成に集中し、任意のプロジェクトの開始時には非常に重要である実装の詳細にあなたの時間を無駄にすることなく、機能のプロトタイプを取得することができます。 ASP.NET MVCに類似したものはありますか? そして、どのように機能的、高速、便利で実用的です。
これを具体的な例で検討したいと思います。そのため、商品の簡単なWebカタログを作成することを提案します。 私の場合、それは自動車部品のカタログになります。
ツールとして、次の開発ツールとライブラリを使用します。
- MS Visual Studio 2010
- ASP.NET MVC 3-公式リリース
- NuGet-Visual Studioのパッケージマネージャー
- MvcScaffolding-テンプレートベースのMVCコードジェネレーター
- EFCodeFirst-Entity Framework CPT5の新機能
インストールとセットアップ
まず、環境をカスタマイズする必要があります。 Visual Studio Extension ManagerでNuGet拡張機能を見つけてインストールします。 または、
公式サイトからダウンロードしてインストールし
ます 。
新しいASP.NET MVC 3プロジェクトを作成します。
次に、パッケージマネージャーのコマンドrunoffを使用してMvcScaffoldingをインストールする必要があります。 NuGetコンソールを開きます:メインメニュー[表示]→[その他のウィンドウ]→[パッケージマネージャーコンソール]。
後で見るように、このコマンドラインはMvcScaffoldingを操作するためのメインツールであり、Railsのコマンドラインに似ています。
パッケージをインストールするには、次のコマンドを実行するだけです:
Install-Package MvcScaffolding
ご覧のとおり、このコマンドはプロジェクトにMvcScaffoldingパッケージと、依存するEFCodeFirstパッケージをインストールします(私の場合は、EFCodeFirstを以前にインストールしました)。
データモデルとアプリケーションドメイン
この例で開発するアプリケーションは、単純な自動車部品カタログであり、店舗または会計システムの一部になることができます。
まず、サブジェクト領域をモデル化する必要があります。
だから私たちが持っているもの:
ビジネスエンティティのメインクラスを作成しましょう。
public class Make
{
public int Id { get ; set ; }
public string Name { get ; set ; }
public List <Model> Models { get ; set ; }
}
public class Model
{
public int Id { get ; set ; }
public string Name { get ; set ; }
public int MakeId { get ; set ; }
[NotMapped]
public string FullName
{
get { return string .Format( "{0} {1}" , Make.Name, Name); }
}
virtual public Make Make { get ; set ; }
public List <Release> Years { get ; set ; }
}
public class Release
{
public int Id { get ; set ; }
public int ModelId { get ; set ; }
public int YearId { get ; set ; }
[NotMapped]
public string FullName
{
get { return string .Format( "{0} ({1})" , Model.FullName, Year.Value); }
}
virtual public Model Model { get ; set ; }
virtual public Year Year { get ; set ; }
public List <Part> Parts { get ; set ; }
}
public class Part
{
public int Id { get ; set ; }
public string Name { get ; set ; }
public string Description { get ; set ; }
public decimal Price { get ; set ; }
public int Quantity { get ; set ; }
public int GroupId { get ; set ; }
virtual public Group Group { get ; set ; }
public List <Release> Releases { get ; set ; }
}
* This source code was highlighted with Source Code Highlighter .
ご覧のように、私たちは、「モデル」、「ブランド」と「解放」と同様に「スペアパーツ」と「解放」の間の「多対多の関係」の割合との間に「1対多の関係」の態度を持っています。 MvcScaffoldingがこの関係をどのように解決し、結果としてどのコードが生成されるのかと思っていました。 将来に目を向けると、ビジネスモデルのクラスを記述するときに遵守する必要がある次のルールに注意する必要があります。
- 主キーを指定します。 Id、{EssenceName} Idまたは属性[Key]になります
- 外部キー{EssenceName} IDを示します
- 複雑な主キーはサポートされていません。 しかし、他にも多くの問題があるため、これは良いことかもしれません。
この例では、「モデル」にMakeIdフィールドを含めました。「Mark」からの外部キーと、仮想フィールドMakeです。 これにより、1対多の関係が実装されます。 多対多の関係を実装するために、対応するリストプロパティをクラスPartおよびReleaseに追加しました
CodeFirstパラダイムの場合、クラスのこの説明で十分です。ストレージと生成の面倒を見る必要はありません。アプリケーションの起動時にすべてが自動的に行われます。 モデルで作業した後、プロジェクトをビルドすることが不可欠です。
テンプレートのカスタマイズとコントローラーの作成
MvcScaffoldingを使用するには、上記で説明したパッケージマネージャーのコマンドラインを開く必要があります。
この手順はオプションですが、まず、テンプレートをカスタマイズして次のコマンドを実行しましょう。
Scaffold CustomTemplate MvcScaffolding.RazorView _CreateOrEdit
Scaffold CustomTemplate MvcScaffolding.RazorView Edit
Scaffold CustomTemplate MvcScaffolding.RazorView Index
Scaffold CustomTemplate MvcScaffolding.Controller ControllerWithRepository
その結果、テンプレートを含む新しいフォルダーがプロジェクトに表示されます。
これで、生成されたコードがアイデアとマークアップに一致するように、これらのテンプレートを編集できます。
次に、最初のコントローラーを作成します。
Scaffold Controller Make -Verbose -ControllerName Make -DbContextType ApartsContext -Repository
ここに:
- Scaffold Controller-コントローラー作成コマンド
- Make-モデルクラス名
- -ControllerName Make —コントローラーの名前を指定しますが、必須ではありませんが、デフォルトではモデルに代わって複数形が生成されます
- -DbContextType ApartsContext-コンテキストクラス
- -リポジトリ-リポジトリを介したデータアクセスを使用する必要があることを示します
その結果、我々は、次のファイルとクラスを作成しました
- Makeエンティティのリストとして作成、削除、変更、および表示するためのメソッドを含むMakeControllerコントローラー
- リポジトリとの通信を提供するApartsContextコンテキスト(作成されていない場合)
- MakeRepositoryリポジトリ-基本的なルールの実装
- ファイルの表示_CreateOrEdit.cshtml、Create.cshtml Delete.cshtml Details.cshtml Edit.cshtml Index.cshtml
ここでは生成されたコードを提供しません。興味のある人は、記事の最後にあるリンクからプロジェクトのソースコードをダウンロードできます。
今度は、同様に第二のコントローラを作成してみましょう:
Scaffold Controller Model -Verbose -ControllerName Model -DbContextType ApartsContext -Repository
作成されたビュー_CreateOrEdit.cshtmlを開き、生成されたコードを確認します。
...
@Html.DropDownListFor(model => model.MakeId, (( IEnumerable <ApartCatalogMvc.Models.Make>)ViewBag.PossibleMakes).Select(option => new SelectListItem {
Text = (option == null ? "None" : option.Name),
Value = option.Id.ToString(),
Selected = (Model != null ) && (option.Id == Model.MakeId)
}), "Choose..." )
...
* This source code was highlighted with Source Code Highlighter .
また、コントローラーコードでも:
...
public ActionResult Edit( int id)
{
ViewBag.PossibleMakes = makeRepository.GetAllMakes();
...
* This source code was highlighted with Source Code Highlighter .
MvcScaffoldingは、1対多の関係を非常にうまく処理しました。モデルの編集ビューで、Markの値が入力されるドロップダウンリストが作成されました。
コントローラーの作成を続けます。
Scaffold Controller Release -Verbose -ControllerName Releases -DbContextType ApartsContext -Repository
Scaffold Controller Part -Verbose -ControllerName Part -DbContextType ApartsContext -Repository
関連するコントローラー、ビュー、およびリポジトリーが作成されました。 「1対多」の割合は、「多対多」はMvcScaffoldingは、関係のために何を生産していないので、しかし、(あなたが唯一のより良い表示のためのドロップダウンリストの作成のパラメータでのFullNameにNameプロパティを置き換えることができます)、ほとんどすべてが順調もあります我々はそれを手動で追加したり、パターン生成を変更するか必要があること(これは別の問題で、私は別の記事やレポート執筆者MvcScaffoldingでの実装例を記述して与えることを試みるだろう、多分彼は次のリリースでは、それが含まれます)。
ここで、コントローラーを持たないディレクトリおよびその他のクラスのリポジトリを作成する必要があります。
Scaffold Repository Year -DbContextType ApartsContext -Verbose
Scaffold Repository Group -DbContextType ApartsContext -Verbose
最初の打ち上げの時が来ました。
この前に、構成内のデータベースに接続文字列を書き込む必要があります。 SQL Expressの場合、物理ファイルが存在しなくてもかまいません。
< add name ="ApartsContext"
connectionString ="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ApartsDB.mdf;Integrated Security=True;User Instance=True;Initial Catalog=ApartsDB"
providerName ="System.Data.SqlClient" />
* This source code was highlighted with Source Code Highlighter .
接続文字列の名前がコンテキストクラスの名前と一致することが重要です。
さらに、テストデータと完成したリファレンスが欲しいです。 これを行うには、DropCreateDatabaseAlwaysクラスから継承したクラスを追加します。これにより、毎回データベースが初期化されます。
public class ApartsInitializer : DropCreateDatabaseAlways<ApartsContext>
{
protected override void Seed(ApartsContext context)
{
var makes = new List <Make>
{
new Make { Name = "BMW" },
new Make { Name = "Mazda" }
};
makes.ForEach(m => context.Makes.Add(m));
...
* This source code was highlighted with Source Code Highlighter .
Global.asaxで、アプリケーションを起動するときに次を追加します。
...
DbDatabase.SetInitializer<ApartsContext>( new ApartsInitializer());
...
* This source code was highlighted with Source Code Highlighter .
少し受け取ったコードを修正して、機能的に機能するアプリケーションを受け取りました。
おわりに
その結果、機能的なプロトタイプを作成するのに数時間しかかかりませんでしたが、すべて改善されました。
仕事で明らかに欠けていた機会:
- リスト内のページングとフィルタリング
- 多対多の関係をサポートする
- DataTmeなど、さまざまなデータ型のバインド
これはすべて重要ではありませんが、テンプレートのカスタマイズとメタプログラミングを介して実装できます。
これまでのところ、EFCodeFirstとMvcScaffoldingはベータ版ですが、非常に機能的であり、Webアプリケーションを迅速に開始および開発するのに十分なほど強力です。
近い将来、これらのツールはより高度な機能を備え、ASP.NET MVCの公式リリースの一部になる予定です。
追加資料
ブログの著者MvcScaffoldingサンプルソース