データベースは、コントローラの基本クラスになります。この基本クラスはControllerを拡張する必要があり、すべてのコントローラは基本クラスを拡張する必要があります。ちょっとした例です:
public class BaseController : Controller
{
private AuthServices _auth;
private LogHelper _log;
private Repository _repository;
/// <summary>
/// <see cref="AuthServices"/>
/// </summary>
protected AuthServices Authorization
{
get { return _auth ?? (_auth = new AuthServices()); }
}
/// <summary>
/// <see cref="LogHelper"/>
/// </summary>
protected LogHelper Log
{
get { return _log ?? (_log = new LogHelper()); }
}
/// <summary>
/// <see cref="Repository"/>
/// </summary>
protected Repository Repository
{
get { return _repository ?? (_repository = new Repository()); }
}
}
遅延インスタンス化に注目してください。それは私がテストを実行する前に忍び込んで私のプライベートフィールドをモックで設定することができます。
セッションに関しては、従来のASP.NETアプリケーションと同じように、ユーザーオブジェクトをセッションに保存することができます。ほぼすべてが(レスポンス、キャッシュ、セッションなど)周辺にありますが、一部はSystem.Web.Abstractionsのクラスでラップされているため、テストのために嘲笑することができます。これらはすべて同じ方法で動作しますが、従来の役割(たとえば、Response.Redirectを使用しないで、リダイレクトを実行するRedirectToRouteResultなどのActionResultを返すなど)では使用しないでください。ご質問の背後にある理由については
....
は、単一のDB接続でストレスをしないでください。あなたの実装によっては、リクエストがお互いに進む可能性があるので、それは悪い考えかもしれません。コネクションを開いて使用し、完了したらそれを破棄してください。
MVCがもたらす最も大きな変化の1つは、従来のASP.NETがWeb開発にもたらしたステートフルモデルの拒否です。そのフレームワークとビューステートはもう存在しません(カーテンの後ろの人には注意を払わないでください)。より複雑ではなく、より堅牢なWebアプリケーションを保持する状態が少なくなる。それを試してみてください。
"テストを実行してプライベートフィールドをモックで設定する前に、怠惰なインスタンス化を行うことができます。なぜIoCを使用しないのですか? –
赤ん坊のステップ......あなたはこれを行う例で答えるべきです。 – Will
私は実際に接続プーリングを使用します。とにかく、ありがとう。これはほぼ正確に私が計画していたもので、私はベストプラクティスにかなり近いと知っています。 –