モデルが永続性にとらわれない場合、どのようにモデルを保存しますか?
質問
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つのオブジェクトは同じことをしていますか?これは混乱を招いたり、後で読めなくなったり、維持できなくなったりする可能性がありますか?