5

私はチュートリアル (特に Linq-To-Entities を使用するもの) を実行してきましたが、基本的な概念は理解していますが、いくつかの問題が発生しています。

通常、チュートリアルには、基本的な create、update、delete ステートメントのみを使用する単純なモデルとフォームのみが含まれます。私のものはもう少し複雑で、6 つのデータベース オブジェクトのリレーションシップを処理するときが来ると、チュートリアルは役に立たなくなるため、これを正しい方法で行っているかどうかはわかりません。

post メソッドの場合、CRUD 操作を実行する通常の方法

entities.AddToTableSet(myClass);
entities.SaveChanges();

完全に実装されたクラスがコントローラーメソッドに投稿されないため、私が望むことはできません。個々のフィールド、フォーム コレクション、または複数の DTO オブジェクトをポストしてから、サービスまたはリポジトリでメソッドを呼び出して、フォーム ポストから受け取った情報と、クエリまたは作成に必要な情報を取得してから、これらすべてを実行して、保存できるデータベース オブジェクトを作成します。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(int id, [Bind(Exclude = "Id")] ClassA classA,
                        [Bind(Exclude = "Id")]ClassB classB)
{
   // Validation occurs here

   if(!ModelState.IsValid)
      return View();

   try
   {
      _someRepositoryOrService.Add(id, classA, classB);
      return RedirectToAction("Index", new { id = id });
   }
   catch(Exception ex)
   {
      // Logging and exception handling occurs here
   }
}


public void Add(int id, ClassA classA, ClassB classB)
{
    EntityA eA = new EntityA
    {
        // Set a bunch of properties using the two classes and
        // whatever queries are needed
    };

    EntityB eB = new EntityB
    {
        // Set a bunch of properties using the two classes and
        // whatever queries are needed
    };

    _entity.AddToEntityASet(eA);
    _entity.AddToEntityBSet(eB);
    _entity.SaveChanges();
}

これを正しく処理していますか、それともフレームワークをろくでなしにしていますか? 実際にエンティティ オブジェクトを直接使用することはありません。クエリを実行するたびに、必要な情報を DTO に入れ、それを基にビューを作成します。創作も同様です。これは許可されていますか、それともエンティティを直接使用しないことは、フレームワークを使用する目的に反していますか?

編集:このエラーメッセージのためにLINQクエリを適切に実行するには空のコンストラクターが必要になるため、このアプローチについても心配しています:

LINQ to Entities では、パラメーターなしのコンストラクターと初期化子のみがサポートされています。

コンストラクターにロジックを必要とすることはめったにないので、これは大したことではありませんが、コンストラクターがなく、パブリック プロパティのみを使用することは問題ですか?

4

2 に答える 2

4

_someRepositoryOrService.Add(id, classA, classB);

リポジトリをプレゼンテーション層と結合すると思います。これはいけません。リポジトリはエンティティでのみ機能する必要があります。次に、Add メソッドがどのように機能するかに注目してください。

public void Add(int id, ClassA classA, ClassB classB)

関心の分離 (SoC) を中断します。次の 2 つのタスクを実行します。

  1. ビュー データをエンティティにマップする
  2. リポジトリに保存

明らかに、最初のステップはプレゼンテーション層で行う必要があります。これにはモデル バインダーの使用を検討してください。モデル バインダーに構築要件を認識させることができるため、コンストラクタの問題を解決するのにも役立ちます。

ViewModels に関する Jimmy Bogard (ASP.NET MVC In Action の共著者) によるこの優れた投稿も確認してください。これは、マッピングの自動化に役立つ場合があります。また、逆の手法も提案しています。コントローラーを ViewModel ではなくエンティティで動作させるようにしてください。カスタム アクション フィルターとモデル バインダーは、実際にはコントローラーではなく、ビューとコントローラーの間のインフラストラクチャの詳細に属するルーチンを排除するための鍵となります。たとえば、エンティティの取得を自動化する方法を次に示しますこれが、コントローラーが何をすべきかを確認する方法です。

ここでの目標は、コントローラーがビジネス ロジックの管理に満足できるようにし、ビジネスに関係のないすべての技術的な詳細を脇に置くことです。この質問で話しているのは技術的な制約であり、コードに漏れさせます。ただし、MVC ツールを使用してインフラストラクチャ レベルに移行できます。

更新: いいえ、リポジトリはフォーム データを処理するべきではありません。それが、「プレゼンテーションと結合する」という意味です。はい、リポジトリはコントローラにありますが、フォーム データでは機能しません。フォームを「リポジトリ データ」(つまりエンティティ)で機能させることができます(そうすべきではありません)。NerdDinner などのほとんどの例ではそうしていますが、その逆はできません。これは一般的な経験則によるものです - 上位層は下位層と結合できます (プレゼンテーションはリポジトリとエンティティと結合されます) が、下位層は上位層に結合されるべきではありません (エンティティはリポジトリに依存し、リポジトリはフォームモデルに依存するなど)。 )。

ClassX から EntityX へのマッピングがそのステップに属していないことを除いて、最初のステップはリポジトリで実行する必要があります。それはマッピングの問題、つまりインフラストラクチャです。たとえば、マッピングに関するこの質問を参照してください。ただし、一般に、2 つのレイヤー (UI とリポジトリ) がある場合は、マッピングを気にする必要はありません。マッパー サービス/ヘルパーが必要です。Jimmy のブログのほかに、ASP.NET MVC In Action を読んだり、コントローラー コンストラクターに渡された IEntityMapper インターフェイスでマッピングを行う方法について、 CodeCampServerを参照したりすることもできます (これは、Jimmy Bogard の AutoMapper よりも手動で作業の少ないアプローチであることに注意してください)。

もう一つ。ドメイン駆動設計について読み、記事を探し、そこから学びますが、すべてに従う必要はありません。これらはガイドラインであり、厳密な解決策ではありません。あなたのプロジェクトがそれを処理できるかどうか、あなたがそれを処理できるかどうかなどを確認してください。これらの手法は、一般に開発を行うための優れた承認済みの方法であるため、適用するようにしてください。ただし、盲目的に受け取らないでください。理解していないことを適用するよりも、途中で学習する方がよいでしょう。

于 2009-09-30T20:23:46.110 に答える
4

DTO を使用し、Entity Framework を独自のデータ アクセス メソッドとビジネス レイヤーでラップすることは、優れた方法だと思います。大量のコードを書くことになるかもしれませんが、Entity Framework で生成されたコードがビジネス レイヤーであると偽るよりは優れたアーキテクチャです。

これらの問題は、必ずしも ASP.NET MVC に関連しているわけではありません。ASP.NET MVC は、基本的に、モデルやデータ アクセスの方法に関するガイダンスを提供しません。また、ASP.NET MVC のサンプルとチュートリアルのほとんどは、実稼働に値するモデルの実装ではなく、実際には最小限のサンプルにすぎません。

あなたは正しい軌道に乗っているようです、続けてください。

最終的には、Entity Framework をほとんどコード ジェネレーターとして使用していて、あまり有用なコードを生成していないため、要件により厳密に一致する他のコード ジェネレーター、ツール、またはフレームワークを検討する必要がある場合があります。

于 2009-09-20T10:02:03.033 に答える