2016-04-09 16 views
0

オニオンフレームワークでは、外側のレイヤーはすべての内側のレイヤーにアクセスできます。私がこれを行うと、私の外層(MVCのUIレイヤー/コントローラ)はアプリケーション/ビジネスサービスとリポジトリに直接アクセスできます。今、私のコントローラは、ドメインモデルを作成し、それをリポジトリを使ってデータストアに保持することができます。したがって、ビジネスレイヤーで書かれた検証やその他のビジネスルールをバイパスします。私は何かが欠けていると信じています。助けてください。 http://jeffreypalermo.com/blog/the-onion-architecture-part-2/オニオンフレームワーク:UI /コントローラはリポジトリに直接アクセスする必要があります

答えて

1

から

public SpeakerController(IConferenceRepository conferenceRepository, 
         IUserSession userSession, IClock clock) 
    : base(userSession) { 
    _conferenceRepository = conferenceRepository; 
    _clock = clock; 
    _userSession = userSession; } 

私はパレルモ自身がTwitterの会話に特に示されていても "ノー" と言います。私は、各レイヤーが次の内部レイヤーと対話し、それをバイパスすることは許されていないと言います。問題の機能が基本的に参照データのCRUDだけである場合は、このルールの例外です。この種のデータに複雑さを追加する理由はありません。

また、リポジトリ実装でビジネスルールの検証を強制することもできます。実装はタマネギの最外層にあるので、これは非常に簡単です。

私はAlistair CockburnのHexagonal Architectureが玉ねぎのアーキテクチャよりも明るくてシンプルであることを発見しました。基本的には「アプリケーションの内側」と「アプリケーションの外側」です。その境界線を越える必要があるときはいつでも、アプリケーションを実装の詳細から保護するためのアダプタが必要です。

+0

私はあなたが正しいと言えば、CRUD操作のビジネスクラスにラッパー/パススルーメソッドを持たせる必要はないということです。 UIでリポジトリメソッドを使用することはOKです。私にとって、リポジトリの「ビジネスルールの検証」は良い考えではありません。これは、ビジネス層を持つという目的を打ち破ります。 – Pragmatic

+0

参照データと検証という2つの異なる問題があります。私は別のコメントでそれらを処理します。 Re:参照データ StateOrProvinceというテーブルがあります。私は、このデータのための必須のフィールドと一意性以外のビジネスルールはないかもしれません。これらの規則は、データベースによって実施することができます。このデータにはCRUD以外の操作はありません。この種のデータのドメインモデルを開発することは過度のことかもしれません。私は通常、この場合、ORMに自分のビューを直接バインドします。 –

+0

Re:Validation ドメイン層に検証ロジックを記述します。ドメインオブジェクトで使用できるドメインレイヤーで定義された永続レイヤーを表す抽象概念が必要です。永続性レイヤの実装でドメインオブジェクトの検証ロジックを '呼び出す 'ことができない理由はありません。事実、OAダイアグラムを注意深く見れば、ダイアグラムの最も外側のラングの1つにパーシスタンスの実装があります。つまり、パーシスタンス層のドメインの完全なコンテキストを取得できます。あなたもそれを使うかもしれません。 –

関連する問題