-1

ドメインモデル(データモデル+ビジネスモデル)が別のクラスライブラリにあるMVCアプリケーションがあります。私は、データを返さなければならないいくつかのメソッドを公開しているインターフェイスを使用していますが、必ずしも自分のドメインオブジェクトの表現全体ではありません。インターフェイスの使用時にドメインモデルが返すべきことは何ですか?

私の質問はどのようにデータを返すべきですか?
ビジネスモデルレイヤーで一種のビューモデルを作成し、メインアプリケーションの実際のビューモデルと一致させる必要がありますか(views-controllers-viewmodels)?
このデータを動的オブジェクトとして返す必要がありますか?
ドメインオブジェクト全体のイベントを返す必要がありますいくつかのプロパティのみが必要ですか?
ベストプラクティスは何ですか?

//Domain Class 
public class User 
{ 
    public string UserName { get; set; } 
    public int UserId { get; set; } 
    public string UserPassword{ get; set; } 
    public string FirstName{ get; set; } 
    public virtual ICollection<ApplicationUserTeam> ApplicationUserTeams 
    { 
     get { return _applicationUserTeams; } 
     set { _applicationUserTeams = value; } 
    }  

} 


public interface ITrackAttendance 
{ 
    dynamic GetUsersCompany(int CompanyId); 

} 

public class TrackAttendanceServices : ITrackAttendance 
{ 
    //Method returning a Dynamic Object??? 
    public dynamic GetUsersCompany(int CompanyId) 
    { 

     using (var _ctx = new TrackAttendanceDb()) 
     { 
      return _ctx.Users.Where(u => u.ApplicationUserTeams.FirstOrDefault().Team.CompanyId== CompanyId)      
       .Select(u => 
         new 
          { 
          UserName = u.UserName, 
          UserId = u.Id, 
          userState = false 

         }).ToList(); 


     } 

    } 

} 

プロジェクトのアーキテクチャ:

この

は、状況についてのより良いアイデアを与える例である

enter image description here

マイソリューション:持っているすべての専門家に

感謝私はこの質問に対して意見を与えられたので、次の点についてDTOアプローチ(@ uk2k05)に従うことにしました:

  • 非常にクリーンなアーキテクチャを維持できます。
  • このアプローチは、1つの責任原則に沿っています。
  • これは、アプリケーションレイヤが基盤となるドメインモデルに依存しないことを保証します。

ファクトリパターン(@Liam)やコマンドクエリ分離(CQS)(@ L-Four)など、ここで挙げたその他の興味深いアプローチを理解しておく必要があります。私の特定の環境に複雑さと作業を追加する可能性があります。 CQSとFPは(私の謙虚で個人的な意見から)アーキテクチャを定義するための心のシフトを必要とします。

+1

ドメインモデルエンティティをクエリ用に返すのはなぜですか?クエリからコマンドを分離し、クエリのためにドメインレイヤをバイパスするのはなぜでしょうか。 –

+0

申し訳ありませんが、私は何を意味していません。もう少し明示的にしてもらえますか?ありがとう。 –

+0

ここであなたがしようとしていることは、[Factory pattern](https://en.wikipedia.org/wiki/Factory_method_pattern)によってより良く解決できると思います。ファクトリを作成し、ファクトリを呼び出してオブジェクトを返します。コントローラ内でこのオブジェクトを使用します(おそらく、インプリメンテーションに応じてViewModelに変換します)。それはあなたの質問が非常に不明であると言いました。例えば、これのどの部分がリポジトリパターンであると思われますか? – Liam

答えて

1

コマンドクエリ分離(CQS)をご覧ください。基本的には、コマンド側からクエリ側を分割することを意味します。

エンティティの作成の更新などのコマンドでは、おそらく今やっているようにドメインモデルを使います。

しかし、クエリの場合、情報を取得するだけでシステムを変更しないので、ドメイン層を通過する必要はありません。したがって、単純にドメイン層をバイパスし、データベースに直接照会し、データエンティティを返すことができます。それをコントローラ内で専用のビューモデルにマップし、ビューに渡します。 と投影されていると、データレイヤーを直接公開するのではなく、それに基づいて構築されたDTOがあることを意味します。ドメインモデルのエンティティとはまったく異なって見える可能性があります。

多くの情報が見つかりました。たとえば、hereとなります。

+0

しかし、それはコントローラから直接データベースに問い合わせることを意味するでしょうか?私はビジネスロジックのためのクラスライブラリを作成して、データベースを扱う層を持つようにしました。 –

+0

いいえ、あなたはあなたのコマンドの横に質問の側を持っています。あなたのドメインモデル用のクラスライブラリを持っているのと同様に、クエリ側も通常のクラスライブラリである可能性があります。 –

+1

ありがとう@LFour。このアプローチは本当に面白いので、実際に使用できるかどうかを判断するために詳細に調べてみたいと思います。私の具体的な環境のために、私は単純化のためにDTSのアプローチをとることに決めました。 –

関連する問題