0

したがって、MVC は次のように分割されます。

  • モデル
  • 意見
  • コントローラー層

多くのページを準備した後、各レイヤーが何をするかを把握していると思いましたが、モデルまたはコントローラーに何かを入れる必要があるかどうかという1つの領域についてまだ困惑しています。

データ ストレージ クラスをコントローラーに入れる必要があることを理解しています UI 修飾子 (つまり、適切なモデルをプルする) をコントローラーに入れる必要があることを理解しています

しかし、モデル修飾子はどうでしょうか。たとえば、ソフトウェア ショッピング カートのアプローチを採用すると、誰かがチェックアウト ボタンをクリックし、支払いの詳細を入力し、すべて承認されたとします。ポストバックがたまたまこれを処理します。

ポストバック オブジェクトは、

  1. データベース テーブルにエントリを追加して、X ユーザーが Y ソフトウェアをダウンロードできるようにする
  2. ユーザーに領収書を送信する
  3. 購入を記録する

通常 (MVC 以外の場合) アプローチでは、情報を格納するために EF を呼び出すソフトウェア テーブルのアクセス生成を処理するクラスを作成します。通知を送信するための 2 番目のクラスと、情報をログに記録するための 3 番目のクラスがあります。

これらのクラスを MVC に保持する必要がありますか? もしそうなら、それらはコントローラーまたはモデルとしてのクラスになりますか?

4

2 に答える 2

4

上で定義した 3 つのポイントはすべて、アプリケーションのモデルの一部を形成します。コントローラーは、モデルとユーザーに提示される UI 表現 (ビュー) の間のオーケストレーションのみを処理する必要があります。

SOLID の原則を遵守することで、(少なくとも) 3 つの別個のコンポーネントを扱っていることに絶対に同意します。

  1. ソフトウェア y をダウンロードしているユーザー x に関するデータを永続化する
  2. 領収書の発行
  3. ロギング

これを行うためにアーキテクチャとコンポーネントを編成するには、さまざまな方法があります。1 つの方法は、これら 3 つのコンポーネントに依存し、それらを使用してリストされた操作を実行するアプリケーション固有のコンポーネント/サービスを用意することです。次に、コントローラーはこのコンポーネントのみに依存します。

于 2012-07-13T21:38:59.967 に答える
3

Russの優れた回答をもう少し詳しく説明するには、次のことを考慮してください。

public class CheckoutController
{
    private readonly ICommandHandler<CheckoutCommand> _checkoutHandler;

    public CheckoutController(ICommandHandler<CheckoutCommand> checkoutHandler)
    {
        _checkoutHandler = checkoutHandler;
    }

    [HttpPost]
    public virtual ActionResult Post(CheckoutViewModel viewModel)
    {
        if (!ModelState.IsValid) return View(viewModel);
        var command = Mapper.Map<CheckoutCommand>(viewModel);
        _checkoutHandler.Handle(command);
        return RedirectToAction("Complete");
    }

    public virtual ActionResult Complete()
    {
        return View();
    }
}

コントローラーはビジネス的なことは何もしていません。ユーザーに制御フローを提供します。ここで、この依存関係がコントローラーに注入されているとします。

public class DomainCheckoutCommandHandler : ICommandHandler<CheckoutCommand>
{
    private readonly IEntityDataStorage _repos;
    private readonly IEmailSender _email;
    private readonly ILogger _log;

    public DomainCheckoutCommandHandler(IEntityDataStorage repos, 
        IEmailSender email, ILogger log)
    {
        _repos = repos;
        _email = email;
        _log = log;
    }

    public void Handle(CheckoutCommand command)
    {
        // use _repos to Add an entry to a database table
        // use _email to issue the receipt
        // use _log to log the purchase
    }
}

これらの 3 つの 投稿には、このようなインターフェイス + DI の使用に関する優れた情報がいくつかあります。

最良の部分は、他のすべてのコード (インターフェイス、ドメイン クラス、およびその他のインターフェイス実装) を MVC プロジェクトの外に完全に移動できることです。そうすれば、MVC プロジェクトではビジネス的なことは何も行われません。ビジネス層または他のクラス ライブラリによって実装されているインターフェイスに委任するだけです。

于 2012-07-13T21:55:52.267 に答える