質問

PHP MVCの背景から来て、ASP.NET MVCに新しい。それは厄介な移行のようなものでした(私の質問履歴、heh。)

私が.NETの世界では大きい理論的には、私が多くのことが非常に大きいモデルが固執することの考えです。しかし、この場合、モデルへの変更を保存するための適切な方法は何ですか?PHPでは、いくつかの変換後に$model->save();を呼び出すだけです。C#で、それをする方法がわからない。

これは適切ですか?

public class AwesomesauceController
{
    //inject!
    public AwesomeSauceController(IDataAccess da)
    {
        DataAccess = da;    
    }
    private readonly IDataAccess DataAccess;

    [HttpGet]
    public ActionResult Edit(int Id)
    {
        // PHP equiv: AwesomeSauceModel::find($id); Controller is unaware of DAL
        return View(DataAccess.AwesomeSauces.Where( sc => sc.Id == Id).FirstOrDefault());
    }

    [HttpPost]
    public ActionResult Edit(AwesomeSauce sc)
    {
        //persistence-aware version: model is aware of DAL, but controller is not
         if($sc->valid()
            $sc->save(); 
            redirect(); 
        }
        else { return view(); }

        // compare to persistence-agnostic version, controller is aware of DAL, but model is not
        if(ModelState.IsValid)
        {
            da.Persist(sc);
            return Redirect();
        }
        else
        {
            return View(sc);
        }
    }
}
.

これについての間違っていると衝突する唯一のものは、通常、コントローラがこのようにデータアクセス層に直接アクセスしたくないことを推測します。以前は、PHP Landでは、私のコントローラは基本的に、モデルと景色のみにアクセスします。

役に立ちましたか?

解決

あなたがしていることは大丈夫です。ActiveRecord vs Repository vs Home Brew DALは、私たちが永遠に議論する永遠の質問です。

リポジトリパターンは.NETの世界は今、その使用例がたくさんあるでしょう。MVCは、データアクセス戦略が何であるかを気にしません。快適だと思うものを使用することは問題なく、他の人がそれをしているので、パターンを使用するよりも優れた戦略です。

他のヒント

モデルにSave()関数が含まれていても問題ありませんが、通常は、Save()の動作をモデルから独立させ、インターフェースに抽象化する必要があります。

設計の原則を忘れないでください。実装ではなく、インターフェースに合わせて設計してください。

もう1つの注意点は、ピースを個別にテストする方法です。モデルがどのように永続化されるかわからない場合は、モデルの実行内容に基づいてテストできます。また、永続化メカニズムは、モデルの実行内容に基づいてテストできます。

いずれの場合も、Create()アクションが二重の役割を果たしているように見えます。モデルを使用して保存し、次にDataAccessを使用して永続化しようとしています。これらの2つのオブジェクトは同じことをしていますか?これは混乱を招いたり、後で読めなくなったり、維持できなくなったりする可能性がありますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top