【F# + ASP.NET MVC】 リポジトリパターンを適用するには

◆参考

 "ASP.NET MVCの開発応用編1 ~リポジトリパターンをマスターする~ "  "テストが容易な ASP.NET MVC アプリケーションを構築する" 

◆ Entity

namespace Sample.Entities

type Employee() = 
    member val ID = "" with get, set
    member val Name = "" with get, set
    member val Password = "" with get, set

◆ リポジトリ用インターフェース

namespace Sample.Interface 

open System.Collections.Generic
open System.ComponentModel.Composition

type IRepository<'T> =
    abstract GetAll: unit -> IList<'T>
    abstract Add: 'T -> unit
    abstract Remove: 'T -> unit
    abstract Save: unit -> unit

◆ リポジトリ

namespace Sample.Repository

open System
open System.Collections.Generic
open System.Linq

open Sample.Interface
open Sample.Entities

type EmployeeRepository() =
    member val private Context = new EduContext() with get, set
    
    interface IRepository<Employee> with
        member x.GetAll() =
            x.Context.Employees.ToList() :> IList<Employee>
        member x.Add(entity : Employee) =
            x.Context.Employees.Add(entity) |> ignore
        member x.Remove(entity : Employee) =
            x.Context.Employees.Remove(entity) |> ignore
        member x.Save() =
            x.Context.SaveChanges() |> ignore
            

◆ Controller(リポジトリパターン)

namespace Sample.Controllers

open System
open System.Web
open System.Web.Mvc

open Sample.Entities
open Sample.Interface
open Sample.Repository

type HomeController =
    inherit Controller
    // コンストラクタ:new(repository : IRepository<Employee>) の呼び出し
    new() = new HomeController(new EmployeeRepository())
    // コンストラクタ:リポジトリの初期化
    new(repository : IRepository<Employee>) as this = {} then
        this._repository <- repository
    
    [<DefaultValue>]
    val mutable private _repository : IRepository<Employee> 
     
    member this.Index() =
        this.View() :> ActionResult
        
    [<HttpPost>]
    member this.Index(entity : Employee) =
        // インターフェース経由でデータ更新
        this._repository.Add(entity)
        this._repository.Save()
        this.View(entity) :> ActionResult

◆ View

@model Sample.Entities.Employee

@{ Layout = null; }

<!DOCTYPE html>
<html>
<head>
    <title>F# + ASP.NET</title>
</head>
<body>
    <div>
        @using (Html.BeginForm()) {
            <fieldset>
                <legend>User</legend>
                <div class="editor-label">
                    @Html.LabelFor(model => model.ID)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.ID)
                </div>
                <div class="editor-label">
                    @Html.LabelFor(model => model.Name)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.Name)
                </div>
                <div class="editor-label">
                    @Html.LabelFor(model => model.Password)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.Password)
                </div>
                <p>
                    <input type="submit" value="Create" />
                </p>
            </fieldset>
        }
    </div>
</body>
</html>

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中